In Java throws
ermöglicht das Schlüsselwort einer Methode, zu deklarieren, dass sie eine Ausnahme nicht alleine behandelt, sondern sie an die aufrufende Methode abgibt.
Gibt es ein ähnliches Schlüsselwort / Attribut in C #?
Wenn es kein Äquivalent gibt, wie können Sie den gleichen (oder einen ähnlichen) Effekt erzielen?
c#
java
exception-handling
throws
Louis Rhys
quelle
quelle
Die Operation fragt nach dem C # -Äquivalent der Java-
throws
Klausel - nicht nach demthrow
Schlüsselwort. Dies wird in Methodensignaturen in Java verwendet, um anzuzeigen, dass eine aktivierte Ausnahme ausgelöst werden kann.In C # gibt es kein direktes Äquivalent zu einer von Java geprüften Ausnahme. C # hat keine äquivalente Methodensignaturklausel.
wird übersetzt in
quelle
Ja, dies ist ein alter Thread, aber ich finde häufig alte Threads, wenn ich Antworten google, also dachte ich, ich würde etwas Nützliches hinzufügen, das ich gefunden habe.
Wenn Sie Visual Studio 2012 verwenden, gibt es ein integriertes Tool, mit dem eine IDE-Ebene "Würfe" -Äquivalente ermöglicht werden kann.
Wenn Sie wie oben erwähnt XML-Dokumentationskommentare verwenden , können Sie mit dem Tag <exception> den von der Methode oder Klasse ausgelösten Ausnahmetyp sowie Informationen darüber angeben, wann oder warum sie ausgelöst werden.
Beispiel:
quelle
throws
bedeutet wahrscheinlich nichts für die Laufzeit, abgesehen davon, dass es für den Entwickler informativ ist. Ebenso hat @mvanella hier darauf hingewiesen, dass C # genau dasselbe tut. Ich gehe davon aus, dass Sie bereits wissen, dass diese "XML-Dokumentation" einen wichtigeren Zweck hat. Ich weiß, dass dieser Thread alt ist.throws
Klausel angegeben oder von einemthrow
Befehl ausgelöst . Das heißt, wenn eine RunTimeException auftritt und nicht in derselben Methode behandelt wird, in der sie auftritt, wird die Ausführung dort gestoppt.Hier ist eine Antwort auf eine ähnliche Frage, die ich gerade auf bytes.com gefunden habe :
quelle
Nachdem ich die meisten Antworten hier durchgesehen habe, möchte ich ein paar Gedanken hinzufügen.
Sich auf Kommentare zur XML-Dokumentation zu verlassen und zu erwarten, dass andere sich darauf verlassen, ist eine schlechte Wahl. Der meiste C # -Code, auf den ich gestoßen bin, dokumentiert Methoden nicht vollständig und konsistent mit XML-Dokumentationskommentaren. Und dann gibt es das größere Problem: Wie können Sie ohne aktivierte Ausnahmen in C # alle Ausnahmen dokumentieren, die Ihre Methode auslöst, damit Ihr API-Benutzer weiß, wie sie alle einzeln behandelt werden? Denken Sie daran, dass Sie nur diejenigen kennen, die Sie in Ihrer Implementierung mit dem Schlüsselwort throw werfen. APIs, die Sie in Ihrer Methodenimplementierung verwenden, lösen möglicherweise auch Ausnahmen aus, von denen Sie nichts wissen, da sie möglicherweise nicht dokumentiert sind und Sie sie in Ihrer Implementierung nicht behandeln, sodass sie angesichts des Aufrufers von Ihnen in die Luft jagen Methode. Mit anderen Worten,
Andreas hat in den Antworten hier ein Interview mit Anders Hejlsberg verknüpft, warum sich das C # -Design-Team gegen geprüfte Ausnahmen entschieden hat. Die endgültige Antwort auf die ursprüngliche Frage ist in diesem Interview verborgen:
Mit anderen Worten, niemand sollte sich dafür interessieren, welche Art von Ausnahme für eine bestimmte API zu erwarten ist, da Sie immer alle überall abfangen werden. Und wenn Sie sich wirklich um bestimmte Ausnahmen kümmern möchten, liegt es an Ihnen, wie Sie mit ihnen umgehen, und nicht an jemandem, der eine Methodensignatur mit einem Schlüsselwort wie Java definiert, das einem API-Benutzer eine bestimmte Ausnahmebehandlung aufzwingt.
- -
Persönlich bin ich hier hin und her gerissen. Ich stimme Anders zu, dass das Überprüfen von Ausnahmen das Problem nicht löst, ohne neue, andere Probleme hinzuzufügen. Genau wie bei den Kommentaren zur XML-Dokumentation sehe ich selten C # -Code mit allem, was in try finally-Blöcken eingeschlossen ist. Es fühlt sich für mich so an, als wäre dies in der Tat Ihre einzige Option und etwas, das als gute Praxis erscheint.
quelle
Das Fehlen von geprüften Ausnahmen in C # kann als gut oder schlecht angesehen werden.
Ich selbst halte es für eine gute Lösung, da geprüfte Ausnahmen folgende Probleme aufwerfen:
Aus diesem Grund wird in den meisten größeren Anwendungen häufig das folgende Muster angezeigt, wenn diese Option aktiviert ist. Ausnahmen treten auf:
Dies bedeutet im Wesentlichen, die Art und Weise zu emulieren, wie C # /. NET alle Ausnahmen behandelt.
quelle
Sie fragen danach:
Eine Ausnahme erneut auslösen
oder
quelle
throw
. Durch die Verwendung geht der Stack-Trace nicht verloren.Es gibt einige flüchtige Ähnlichkeiten zwischen dem .Net CodeContract
EnsuresOnThrow<>
und dem Javathrows
Deskriptor, da beide dem Aufrufer als Ausnahmetyp signalisieren können, der von einer Funktion oder Methode könnte, obwohl es auch große Unterschiede zwischen den beiden gibt:EnsuresOnThrow<>
geht über die bloße Angabe, welche Ausnahmen ausgelöst werden können, hinaus, legt aber auch die Bedingungen fest, unter denen sie garantiert ausgelöst werden - dies kann in der aufgerufenen Methode ein ziemlich lästiger Code sein, wenn die Ausnahmebedingung nicht trivial zu identifizieren ist. Javathrows
gibt einen Hinweis darauf, welche Ausnahmen ausgelöst werden könnten (dh IMO liegt der Fokus in .Net innerhalb der Methode, die sich zum Nachweis der Verträge zusammenziehtthrow
, während sich in Java der Fokus auf den Aufrufer verlagert, um die Möglichkeit der Ausnahme anzuerkennen).throws
auf seiner Schnittstelle eine Ausnahme für dieselbe Ausnahme hinzufügt .Code Vertragshandbuch hier
quelle
Wenn die c # -Methode nur eine Ausnahme auslösen soll (wie der Rückgabetyp js sagt), würde ich empfehlen, nur diese Ausnahme zurückzugeben. Siehe das folgende Beispiel:
quelle
Für diejenigen, die sich fragen, müssen Sie nicht einmal definieren, was Sie fangen, um es an die nächste Methode weiterzugeben. Wenn Sie alle Fehler in einem Hauptthread behandeln möchten, können Sie einfach alles abfangen und wie folgt weitergeben:
quelle