我在服务器端集线器上得到了一个简单的示例,该方法是:

    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客户端上获取类型化的异常代理?
如果没有,除了提到的事件分类混乱,还有什么想法可以在没有它们的情况下实现我想要的?

最佳答案

在中心方法周围放置一条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;
    }
}


这两种方法都会使您的错误对象及其相应的属性出现在客户端上。但是,如果这是一个面向客户的应用程序,我建议不要使用此方法。如果可以避免的话,将异常暴露给客户端永远都不是一件好事。

希望这可以帮助!

10-07 22:20
查看更多