12

J'ai une classe d'exception personnalisée comme suit:Ajouter des propriétés supplémentaires dans Exception personnalisée pour revenir à la fonction 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 

J'utilise cela pour certains cas dans les déclarations de réponses AJAX.

Dans la fonction d'erreur de ma réponse AJAX Je suis déterminer que l'erreur est de mon type personnalisé comme celui-ci:

.... 
ajax code.... 
.error = function (xhr, text, message) { 
    var parsed = JSON.parse(xhr.responseText); 
    var isSamCustomError = (parsed.ExceptionType).toLowerCase().indexOf('samexception') >= 0; 
.... etc.... 

Cela me permet de republier une réponse spécifique au client si l'erreur est de mon type personnalisé.

MAIS ... Je ne peux pas sembler l'obtenir pour signaler la propriété supplémentaire OfferBugSend au client pour le code AJAX pour gérer ce cas différemment.

console.log("OfferBugSend: " + parsed.OfferBugSend) 

est montrant non définie, et si je vérifie la réponse, c'est parce que xhr.responseText ne contient que les propriétés:

ExceptionType 
Message 
StackTrace 

Ces propriétés sont de la classe de base Exception mais il ne passe pas ma classe personnalisée propriétés ...

Comment puis-je y arriver?

+1

Veuillez joindre un exemple de code comment vous soumettez votre AJAX et lancez votre 'SamException'. – codeDom

+0

Je conseille d'essayer d'attraper le code que vous voulez. Si vous frappez votre exception, renvoyez cette exception de BLL/DAL dans votre couche Présentation. Dans votre couche de présentation, fournissez un moyen de renvoyer le type d'exception Nouveau qui sera converti à partir de votre exception. L'exemple est, try catch (exception spéciale) {return new {.SpecialMessage = "IamError",. IsError = True}. Dans votre Ajax, vérifiez IsError. – Programmer

Répondre

3

La classe Exception est sérialisable, mais elle contient un IDictionary et implémente ISerializable, ce qui nécessite un peu plus de travail pour la sérialisation de votre classe d'exception personnalisée.

La plus facile de traiter ce problème est en tirant parti de la collection Data de la classe d'exception comme ceci:

Public Property OfferBugSend As Boolean 
    Get 
     Return Data("OfferBugSend") 
    End Get 
    Set(value As Boolean) 
     Data("OfferBugSend") = value 
    End Set 
End Property 

Une autre façon de le faire est d'assurer votre classe dérivée implémente également l'interface ISerializable, ce qui implique fournissant un constructeur de sérialisation et remplaçant GetObjectData(). Voir ce other answer (en C#) comme base pour cette approche.