Wie kann man herausfinden, welche Ausnahmen eine bestimmte Methode auslösen kann, wenn dies nicht in MSDN dokumentiert ist?

8

Kürzlich bekam ich eine Ausnahme, die ich nicht erwartet hatte, weil es in MSDN nicht dokumentiert war, dass es vom bestimmten Konstruktor ausgelöst werden kann. Also hier ist die C # -Zeile, die Ausnahme ausgelöst hat:

%Vor%

filePath Hier ist die Zeichenfolge, die den vollständigen Pfad zu einer bestimmten Datei enthalten soll. Das Problem war, dass meine Variable "filePath" eigentlich ein Pfad zum Ordner und nicht zur Datei war. Aus diesem Grund hat der Konstruktor StreamReader (filePath) Folgendes ausgelöst:

%Vor%

Ok, das war offensichtlich ein Fehler, und ich habe es behoben, indem ich einen korrekten Pfad übergeben habe ... aber ich betrachte die MSDN-Dokumente für StreamReader (string) Ich sehe keine Erwähnung dieser Ausnahme. Im Ausnahmebereich gibt es:

  • ArgumentException - Pfad ist eine leere Zeichenfolge ("").
  • ArgumentNullException - Der Pfad ist null.
  • FileNotFoundException - Die Datei kann nicht gefunden werden.
  • DirectoryNotFoundException - Der angegebene Pfad ist ungültig, z. B. wenn er sich auf einem nicht zugeordneten Laufwerk befindet.
  • IOException - Der Pfad enthält eine falsche oder ungültige Syntax für den Dateinamen, das Verzeichnis Name oder Datenträgerbezeichnung.

Wenn Sie sich mehr über dieses Problem Gedanken machen, sollte die ausgelöste Ausnahme eigentlich IOException und nicht UnauthorizedAccessException sein. Ist das ein Fehler in .NET Framework? Das Problem ist, dass ich einen IOException-Handler an Ort und Stelle hatte, der den Benutzer über den ungültigen Dateipfad benachrichtigt und den Anwendungs-Workflow ohne Absturz fortsetzt. Diese UnauthorizedAccessException stürzte meine Anwendung ab, weil sie nicht behandelt wurde.

Wie soll ich mit dieser Art von Problemen umgehen? Ich denke, ich stoße in der Vergangenheit auf ein ähnliches Problem mit undokumentierten Ausnahmen, aber dieser hat mich wirklich motiviert, dieses Problem zu untersuchen und hier eine Frage zu stellen.

    
matori82 16.01.2014, 19:22
quelle

5 Antworten

7

Leider gibt es wirklich keine Möglichkeit, mit diesem Problem allgemein umzugehen. Die Natur von C # und der CLR macht es schwierig, wenn nicht gar unmöglich, den vollständigen Satz von Ausnahmen zu ermitteln, die von einer Methode ausgelöst werden können. Es gibt einige einfache APIs, wo es möglich ist, aber im Allgemeinen nicht.

Die Art, wie ich damit umgehe, ist, einfach Exception abzufangen. Neuere Versionen der CLR machen es standardmäßig unmöglich, gefährliche Ausnahmen zu erfassen. Daher werden Sie nur sicherere Ausnahmen erhalten. Wenn Sie nicht auf einen bestimmten Fehler reagieren möchten, fangen Sie einfach alle ab und ergreifen Sie die entsprechenden Maßnahmen, damit der API-Aufruf fehlschlägt.

    
JaredPar 16.01.2014 19:26
quelle
3

Obwohl Sie sich vorher nicht 100% bewusst sein können, welche Arten von Ausnahmen eine Methode auslösen kann, gibt es Möglichkeiten, zu vermeiden, dass Sie zu diesem Thema beten, denn in der CLR fehlt tatsächlich etwas, Sie folgen einem gemeinsamen Muster, nämlich um alle Ausnahmen, die von Exception abgeleitet wurden, abzufangen und dann weiter zu unterscheiden, welche Sie behandeln können und welche nicht,

%Vor%

Es wird Ihr Debugging viel einfacher machen.

Beachten Sie, dass dieses Muster auf einer Hierarchie basiert, wobei die abgeleiteten Ausnahmearten zuerst gehen sollten oder Sie riskieren, dass die weniger abgeleitete catch zuerst ausgeführt wird. Mit anderen Worten, tu das nicht,

%Vor%

Alternativ könnten Sie nur Exception abfangen und einen if verwenden, um nach dem tatsächlichen Typ zu suchen, der nicht so hübsch ist, aber möglicherweise flexibler ist,

%Vor%     
rae1 16.01.2014 19:33
quelle
2

Ich denke nicht, dass es sowieso alle möglichen Ausnahmen gibt, die durch eine Methode ausgelöst werden könnten. Tatsache ist, dass Sie alle Methodenaufrufe wiederholen müssen, um diese Liste zu erhalten, und das wird einfach nicht passieren.

Persönlich sind meine Gefühle in der Ausnahmebehandlung eher in der Richtung von Joel Spolsky ( Ссылка ) ; Ich erfahre selten spezielle Ausnahmen und versuche, den Versuch zu vermeiden, so oft es vernünftigerweise möglich ist. In diesem Fall würde ich catch (Exception e) verwenden, um dieses Problem zu vermeiden, dann würde ich ein if-else verwenden, um verschiedene Typen so gut wie möglich zu behandeln.

    
evanmcdonnal 16.01.2014 19:32
quelle
1

Ich habe das vorher gelesen ... möge es dir einen Einblick geben. Microsoft Program Manager schrieb dies in einer Blog .

    
Adi Barman 16.01.2014 19:29
quelle
1

Es gibt verschiedene Szenarien, in denen Microsoft falsche Ausnahmen oder Ausnahmen angibt, die in msdn für bestimmte Methoden nicht erwähnt werden. Ich sah mich auch einer ähnlichen Situation gegenüber, in der ich die allgemeine Ausnahme anstelle der spezifischen Ausnahme abfangen musste (system.formatexception in meinem Fall).

Aber dann können Sie Probleme wie, vermeiden statische FxCop Verletzung. Laut fxcop sollte man keine allgemeine Ausnahme einfangen.

Wir haben den Grund gefunden, warum wir den falschen Ausnahmetyp bekommen und es war Exception innerhalb einer anderen Ausnahme, die die echte Ausnahme zum Ausweichmanöver führte.

** Eine Ausnahme zu bekommen ist wie ein Körperschmerz. Beide sagen, dass es ein Problem im System gibt, aber die Einnahme der gleichen Medizin für alle Schmerzen ist nicht gut, also versuche in diesem Fall eine spezifische Ausnahme zu finden.

    
sunnytyra 17.01.2014 09:31
quelle