2009-11-26 5 views
24

ich benutzerdefinierte Ausnahmeklasse erstellt habenIdentifizieren Ausnahmetyp in einem Handler

public class Web2PDFException : Exception 
{ 
    public Web2PDFException(string message, 
     Exception innerException) 
     : base(message, innerException) 
    { 
    } 
} 

In meiner Anwendung möchte ich, um herauszufinden, ist throw Ausnahme meine benutzerdefinierte Ausnahme ist oder nicht.

try 
{ 
} 
catch (Exception err) 
{ 
//Find exception type here 
} 

Antwort

33

AKTUALISIERT: unter der Annahme C# 6, sind die Chancen, dass Ihr Fall kann als Ausnahmefilter ausgedrückt werden. Dies ist der ideale Ansatz aus Sicht der Leistung Ihre Anforderung unter der Annahme, kann in Bezug auf mich, zum Beispiel ausgedrückt werden:

try 
{ 
} 
catch (Web2PDFException ex) when (ex.Code == 52) 
{ 
} 

Unter der Annahme, C# < 6, die am effizientesten ist, eine bestimmte Exception Art zu fangen und zu tun Umgang darauf bezogen. Jede catch-all Handhabung kann

try 
{ 
} 
catch (Web2PDFException ex) 
{ 
} 

oder

try 
{ 
} 
catch (Web2PDFException ex) 
{ 
} 
catch (Exception ex) 
{ 
} 

oder separat durchgeführt werden (wenn Sie einen allgemeinen Handler schreiben müssen - die in der Regel eine schlechte Idee ist, aber wenn Sie sicher sind, ist es am besten für Sie, sind Sie sicher):

if(err is Web2PDFException) 
{ 
} 

oder (in bestimmten Fällen, wenn Sie etwas komplexere Art Hierarchie Sachen tun müssen, die mit is)

ausgedrückt werden kann nicht
if(err.GetType().IsAssignableFrom(typeof(Web2PDFException))) 
{ 
} 

oder wechseln Sie zu VB.NET oder F # und verwenden is oder Type.IsAssignableFrom in Ausnahmefilter

+0

if (err Web2PDFException ist) ist, dass ich :) – Tomas

+0

nutzen zu können, die "erforderlich ist "operator er muss nicht auf VB.NET wechseln –

+0

@BeowulfOF: Ich weiß, aber wenn er nur versucht, Filterung basierend auf Typen zu tun - dh eine Art von bedingten Fang usw., kann es nützlich sein, ein ist * in einem Ausnahme-Filter statt in einem catch-Block * - es könnte eine Vorgehensweise sein, die funktioniert. Mein erster Vorschlag (und es ist immer noch in der Antwort) ist ein im Catch-Block. Fazit ist, dass, wenn man bedenkt, dass ein "ist" normalerweise ein schlechter Geruch ist, wir genauso gut eine Liste mit möglichen Lösungen haben und Tomas auswählen können, was am besten zu seinem spezifischen Kontext passt. Aber ja, es ist unwahrscheinlich. –

15
try 
{ 
    // Some code 
} 
catch (Web2PDFException ex) 
{ 
    // It's your special exception 
} 
catch (Exception ex) 
{ 
    // Any other exception here 
} 
+0

Wenn es 10 bekannte Ausnahmen gibt, wird die Fangkette hässlich aussehen. – derek

1

Sie immer Ausnahmen so konkret wie möglich fangen sollte, so dass Sie

try 
{ 
    //code 
} 
catch (Web2PDFException ex) 
{ 
    //Handle the exception here 
} 
verwenden sollten

Sie können natürlich so etwas verwenden, wenn Sie darauf bestehen:

try 
{ 
} 
catch (Exception err) 
{ 
    if (err is Web2PDFException) 
    { 
     //Code 
    } 
} 
5
try 
{ 
} 
catch (Exception err) 
{ 
    if (err is Web2PDFException) 
     DoWhatever(); 
} 

aber es gibt wahrscheinlich einen besseren Weg zu tun, was auch immer Sie wollen.

+0

Warum wurde das abgelehnt? Es entspricht mehreren anderen Beispielen. – jp2code

1

können Sie einige zusätzliche Informationen, um Ihre Ausnahme in Ihrer Klasse hinzufügen und dann, wenn Sie die Ausnahme abfangen können Sie Ihre kundenspezifischen Informationen steuern Sie Ihre Ausnahme

this.Data["mykey"]="keyvalue"; //you can add any type of data if you want 

zu identifizieren und dann können Sie Ihr Wert

erhalten
string mystr = (string) err.Data["mykey"]; 

wie die für weitere Informationen: http://msdn.microsoft.com/en-us/library/system.exception.data.aspx

+0

Nicht sicher, warum dies auch abgelehnt wurde. Dies bietet eine gute Möglichkeit, zusätzliche Daten für Ihren Code bereitzustellen. – jp2code

+0

@ jp2code Ich rate, weil es das OP nicht beantwortet? –

54

Wenn mit Situationen zu tun, wo ich don Wenn ich genau weiß, welcher Ausnahmetyp aus einer Methode hervorgehen könnte, ist es ein kleiner "Trick", den ich gerne mache, den Klassennamen der Exception wiederherzustellen und ihn dem Fehlerprotokoll hinzuzufügen, so dass es mehr Informationen gibt.

try 
{ 
    <code> 

} catch (Exception caughtEx) 
{ 
    throw new Exception("Unknown Exception Thrown: " 
         + "\n Type: " + caughtEx.GetType().Name 
         + "\n Message: " + caughtEx.Message); 
} 

Ich bürgen für immer Ausnahmen Typen einzeln, aber das Extra an info Handhabung kann hilfreich, besonders, wenn sie mit Code von Menschen zu tun, die Liebe Catch-All-generische Typen zu erfassen.

+6

Ich bin hier verwirrt (vor allem von den Upvotes). Sie ersetzen eine nützliche Ausnahme durch einen Stacktrace mit einem anderen, der nur die Highlights enthält? Selbst wenn Sie die Ausnahme als 'caughEx' auf 'calledEx' beziehen würden, würde ich mich fragen, was der Punkt ist (wenn Sie die vollständige' exception.ToString() 'zeigen, wird Ihnen der Typ trotzdem angezeigt). Ich könnte verstehen, wenn Sie es an dieser Stelle vor einem 'throw;' Logging ... –

+4

In meinem Fall brauchte ich dies für die Protokollierung, so 'caughEx.GetType(). Name' war genau das, was ich suchte . Vielen Dank! – mayabelle

+0

@RubenBartelink Ja, in der Tat ist die Überlegung, dass die Ausnahme in einer Protokolldatei anstelle der etwas aufdringlichen Stack-Trace angezeigt werden soll. Wie bei allem hängt es davon ab, was Sie brauchen. Normalerweise binde ich die Exception-Behandlung während der Entwicklung so, dass ich Fehler einfach verfolgen und sie dann bereinigen oder nach Bedarf anpassen kann (bei Bedarf die Stack-Traces aufrufen). Wie ich schon sagte, benutze ich meistens das, wenn ich mit Codebasen arbeite, in denen die korrekte Handhabung von Exceptions von früheren Entwicklern vernachlässigt wurde. – Oskuro

1

Alternativ:

var exception = err as Web2PDFException; 

if (excecption != null) 
{ 
    Web2PDFException wex = exception; 
    .... 
} 
4

anstelle von Hartcodierung und neu zu kompilieren, warum nicht nur rufen Sie die GetType Methode aus der aktuellen Ausnahme Visual Studio-Debugger?

Um dies zu tun, während des Debuggen kann man Methoden mit dem Immediate Window des Debuggers aufrufen. Zum Beispiel musste ich wissen, was die Ausnahme war und extrahiert nur die Name Eigenschaft GetType als solche ohne neu kompilieren zu müssen:

enter image description here

Verwandte Themen