2010-12-13 4 views
1

Gibt es einen besseren Weg, dies zu tun, als nach Exception String zu suchen?Wie erhalten Sie den Ausnahmetyp ohne den String-Namen-Vergleich (ex.GetType(). FullName) im ASP.NET Page_Error-Handler?

Ich hätte lieber diesen Catch-All-Fehler auf der Seite behandelt, aber für SOAP-Ausnahmen (Web-Service-Aufrufe) muss ich die Details der tatsächlichen Ausnahme protokollieren, die auf dem Server aufgetreten ist, nicht der Client.

Die Eigenschaft ".Detail.InnerText" befindet sich nicht in einer generischen Ausnahme und kann nur nach dem Generieren einer generischen Ausnahme für eine SOAP-Ausnahme abgerufen werden.

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(); 
     } 
    } 

Ich würde denken, es eine Möglichkeit, die zugrunde liegenden Ausnahme des Typs String-Vergleich ohne ... im Voraus

Dank zu erhalten ist.

Antwort

3

Können Sie versuchen some wie folgt aus:

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

Etwas besser zu 'As' Operator zu verwenden, so dass nur ein Cast-Operator benötigt wird, wie in @ Dima's [Antwort] (http://stackoverflow.com/questions/4434030/how-to-get-exception-type-without- String-Name-Ex-Gtterpe-Fullname-Vergleich/4434091 # 4434091). – Richard

+0

Sehr wahr - das ist in der Tat rasant von einem Opcode, obwohl die Einsparungen nicht so klar sind. IIRC, ist die Anweisung, die für "wie" Casting ausgegeben wird, ziemlich ein bisschen teurer als eine C-artige Besetzung. Vielleicht macht "ist" das Gleiche. Auf jeden Fall bevorzuge ich meine Version aus Gründen der Lesbarkeit. – Ben

2

entweder den as Operator: (. Siehe Dima's answer)

var ex = Context.Server.GetLastError(); 

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

Oder geben Sie Objekte vergleichen:

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

Man geht davon aus, dass Sie auf ein Mitglied von SoapException zugreifen möchten, wobei der as-Ansatz mehrere Typprüfungen vermeidet.

Verwandte Themen