我在服务器端集线器上获得了一个简单的示例,方法如下:
public int CanThrowException(int input)
{
if (0==input)
throw new ArgumentOutOfRangeException("input", "was zero");
return -input;
}
在客户端上:
$.connection.testHub.server.canThrowException(0).fail(function (x)
{
console.log(x);
});
现在,当我检查 x
时,我得到的是一个包含参数名称和我的消息的字符串。
我正在寻找一种获取反射(reflect)服务器端异常属性的实际 Javascript 对象的方法。因此,在给定的情况下,它应该具有属性 message
、actualValue
和 ParamName
。
我为什么要这个?因为我想编写通常会返回对象的服务器端代码,但在某些情况下会抛出一个异常,其中包含有关错误的详细信息,这在我的场景中向用户显示是绝对有意义的(实际上,它不是这是有道理的,这是必要的)。
现在,当然,我可以在捕获服务器端异常时调用一些 client.caller.OnErrorThisAndThat()
方法。但是,这会使我的 JavaScript 代码变得更加复杂,因为我必须保留最后调用的服务器端方法的状态, Hook 该回调并在这两者之间建立连接。
那么有没有办法在 JavaScript 客户端上获取类型化异常代理? 如果没有,除了提到的事件排序困惑之外,有什么想法如何在没有它们的情况下实现我想要的目标?
最佳答案
在可能会引发错误的集线器方法周围放置一条 try catch 语句。
当服务器抛出异常时调用客户端方法:
public int CanThrowException(int input)
{
try
{
if (0==input) {
throw new ArgumentOutOfRangeException("input", "was zero");
}
return -input;
}
catch(Exception e)
{
Clients.Caller.ErrorOnServer(e);
}
}
返回错误对象:
public object CanThrowException(int input)
{
try
{
if (0==input) {
throw new ArgumentOutOfRangeException("input", "was zero");
}
return -input;
}
catch(Exception e)
{
return e;
}
}
这两种方法都会在客户端获取错误对象及其相应的属性。但是,如果这是面向客户的应用程序,我建议不要使用此方法。如果可以防止的话,向客户端公开异常从来都不是一件好事。
希望这有帮助!
关于javascript - SignalR:在 Javascript 客户端上捕获服务器异常且属性完好无损,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059518/