Добавьте дополнительные свойства в 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(). См. Этот другой ответ (на С#) в качестве базовой линии для этого подхода.