SignalR: перехват исключений сервера на клиенте Javascript с сохранением свойств

Я получил в простом примере на серверном концентраторе этот метод:

    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, отражающий свойства исключения на стороне сервера. Итак, в данном случае он должен иметь свойства message, actualValue а также ParamName,

Зачем мне это? Потому что я хочу написать серверный код, который обычно будет возвращать объекты, но в некоторых случаях выдает исключение, которое будет содержать подробную информацию об ошибке, которая, в свою очередь, имеет абсолютный смысл в моем сценарии, чтобы показать пользователю (на самом деле, это не так просто имеет смысл, это необходимо).

Теперь, конечно, я мог бы назвать некоторые client.caller.OnErrorThisAndThat() метод при отлове исключения на стороне сервера. Однако это сделало бы мой код JavaScript более сложным, потому что я должен был бы указать, какой метод на стороне сервера я вызвал последним, подключиться к этому обратному вызову и установить связь между этими двумя.

Так есть ли способ получить типизированные прокси исключения на клиенте JavaScript? А если нет, то есть идеи, как добиться того, чего я хочу без них, кроме упомянутого event-sorta-mess?

1 ответ

Решение

Поместите оператор 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;
    }
}

Оба эти подхода помогут вам получить объект ошибки на клиенте с соответствующими свойствами. Тем не менее, я бы рекомендовал не использовать этот метод, если это приложение для клиентов. Никогда не стоит выставлять клиентам исключения, если это можно предотвратить.

Надеюсь это поможет!

Другие вопросы по тегам