Добавьте дополнительные свойства в Custom Exception, чтобы вернуться к функции AJAX
У меня есть специальный класс исключения следующим образом:
<Serializable>
Public Class SamException
Inherits Exception
Public Sub New()
' Add other code for custom properties here.
End Sub
Public Property OfferBugSend As Boolean = True
Public Sub New(ByVal message As String)
MyBase.New(message)
' Add other code for custom properties here.
End Sub
Public Sub New(ByVal message As String, ByVal inner As Exception)
MyBase.New(message, inner)
' Add other code for custom properties here.
End Sub
End Class
Я использую это для некоторых случаев в ответах от ответов AJAX.
В функции ошибки моего ответа AJAX я определяю, что ошибка относится к моему такому типу:
....
ajax code....
.error = function (xhr, text, message) {
var parsed = JSON.parse(xhr.responseText);
var isSamCustomError = (parsed.ExceptionType).toLowerCase().indexOf('samexception') >= 0;
.... etc....
Это позволяет мне отправить ответ на конкретный ответ клиенту, если ошибка относится к моему пользовательскому типу.
НО... Я не могу заставить его опубликовать дополнительное свойство OfferBugSend
для клиента, чтобы код AJAX обрабатывал этот случай по-разному.
console.log("OfferBugSend: " + parsed.OfferBugSend)
показывает undefined, и если я проверяю ответ, это потому, что xhr.responseText
содержит только свойства:
ExceptionType
Message
StackTrace
Эти свойства относятся к базовому классу Exception
, но не передают мои пользовательские свойства класса...
Как я могу это сделать?
Ответы
Ответ 1
Класс Exception сериализуем, но содержит IDictionary и реализует ISerializable, что требует немного больше работы для сериализации вашего пользовательского класса исключений.
Более простой способ справиться с этим заключается в использовании Data коллекции класса Exception, например:
Public Property OfferBugSend As Boolean
Get
Return Data("OfferBugSend")
End Get
Set(value As Boolean)
Data("OfferBugSend") = value
End Set
End Property
Другой способ сделать это - убедиться, что ваш производный класс также реализует интерфейс ISerializable, который включает предоставление конструктора сериализации и переопределение GetObjectData(). См. Этот другой ответ (на С#) в качестве базовой линии для этого подхода.