SignalR:在Javascript客户端上捕获服务器异常,其属性保持不变

时间:2013-02-25 03:13:52

标签: javascript exception signalr signalr-hub

我在服务器端集线器上获得了一个简单的示例:

    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时,我得到的是一个包含参数名称和我的消息的字符串。

我正在寻找的是一种获取实际Javascript对象的方法,该对象镜像服务器端异常的属性。因此,在给定的情况下,它应该具有属性messageactualValueParamName

为什么我要这个?因为我想编写通常会返回对象的服务器端代码,但在某些情况下会抛出一个异常,其中包含有关错误的详细信息,这反过来在我的场景中向用户显示绝对意义(实际上,它不是只是有意义,这是必要的。)

当然,我可以在捕获异常服务器端时调用一些client.caller.OnErrorThisAndThat()方法。但是,这会使我的JavaScript代码变得更复杂,因为我必须保持状态最后调用的服务器端方法,挂钩到该回调并在这两个之间建立连接。

那么有没有办法在JavaScript客户端上获取类型化的异常代理? 如果没有,任何想法如何实现我想要的没有它们,除了提到的事件 - sorta-mess?

1 个答案:

答案 0 :(得分:4)

在hub方法周围设置一个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;
    }
}

这两种方法都可以在客户端上获取您的错误对象及其相应的属性。但是,如果这是面向客户的应用程序,我建议不要使用此方法。如果可以阻止将异常暴露给客户,那永远不会好。

希望这有帮助!