2010-12-13 75 views
1

Existe-t-il une meilleure façon de faire cela que de vérifier la chaîne Exception? Je préférerais que cette erreur fourre-tout soit gérée sur la page, mais pour les exceptions SOAP (appels de service Web), je dois consigner les détails de l'exception réelle qui s'est produite sur le serveur, pas sur le client. La propriété ".Detail.InnerText" ne fait pas partie d'une exception générique et ne peut être obtenue qu'après l'envoi d'une exception générique à une exception SOAP.Comment obtenir le type d'exception sans nom de chaîne (ex.GetType(). FullName) comparaison dans ASP.NET Page_Error handler?

protected void Page_Error(object sender, EventArgs e) 
    { 
     Exception ex = Context.Server.GetLastError(); 

     if (ex.GetType().FullName == "System.Web.Services.Protocols.SoapException") 
     { 
      System.Web.Services.Protocols.SoapException realException = (System.Web.Services.Protocols.SoapException)ex; 
      Response.Clear(); 

      Response.Output.Write(@"<div style='color:maroon; border:solid 1px maroon;'><pre>{0}</pre></div>", realException.Detail.InnerText); 
      Response.Output.Write("<div style='color:maroon; border:solid 1px maroon;'><pre>{0}\n{1}</pre></div>", ex.Message, ex.StackTrace); 

      Context.ClearError(); 
      Response.End(); 
     } 
    } 

Je pense qu'il ya un moyen d'obtenir au type d'exception sous-jacente sans utiliser la comparaison de chaînes ...

Merci à l'avance.

Répondre

3

Pouvez-vous essayer somethink comme ceci:

var ex = Context.Server.GetLastError(); 

var soapEx = ex as SoapException; 
if(soapEx != null) 
{ 
    //Handle SoapException 
} 
0
if (ex is System.Web.Services.Protocols.SoapException) 
{ 
    var soapEx = (System.Web.Services.Protocols.SoapException)ex; 
    // do your thing 
} 
+0

Il est préférable d'utiliser l'opérateur 'as' de sorte qu'un seul opérateur de cast est nécessaire comme dans @ Dima's [answer] (http://stackoverflow.com/questions/4434030/how-to-get-exception-type-without- string-name-ex-gettype-fullname-comparaison/4434091 # 4434091). – Richard

+0

Très vrai - cela rase effectivement un opcode cast, bien que les économies ne soient pas aussi claires. IIRC, l'instruction émise pour "as" casting est un peu plus cher que d'un casting de style C. Peut-être que "est" fait la même chose, cependant. En tout cas, j'ai tendance à préférer ma version pour des raisons de lisibilité. – Ben

2

Soit utiliser l'opérateur as: (. Voir Dima's answer)

var ex = Context.Server.GetLastError(); 

var soapEx = ex as SoapException; 
if(soapEx != null) 
{ 
    //Handle SoapException 
} 

ou comparer les objets de type:

var ex = Context.Server.GetLastError(); 
if (ex.GetType() == typeof(SoapException) { 
    .. 
} 

On suppose que vous voulez accéder à un membre de SoapException, l'approche as évite plusieurs vérifications de type.