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;
}
}
Оба эти подхода помогут вам получить объект ошибки на клиенте с соответствующими свойствами. Тем не менее, я бы рекомендовал не использовать этот метод, если это приложение для клиентов. Никогда не стоит выставлять клиентам исключения, если это можно предотвратить.
Надеюсь это поможет!