javascript - SignalR:在 Javascript 客户端上捕获服务器异常且属性完好无损

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

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

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

现在,当然,我可以在捕获服务器端异常时调用一些 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/

相关文章:

javascript - 从 Node.js 多次调用 Web 服务

c# - 命名迭代器和异常

c# - C# 中 'try' 的性能成本

c++ - 何时捕获 boost::bad lexical_cast

jquery - 使用 signalR 通过 1 次广播更新多个 View

javascript - 下拉菜单不起作用

javascript - javascript中concat的语法

c# - 如何在页面回发后保留 Asp Net GridView 数据(来自 SignalR)?

SignalR 无法调用非委托(delegate)类型

javascript - AWS 放大 : onStatusChange then render main page