Frage

Ich bin eine benutzerdefinierte Klasse in C # zu schreiben, und ich werfen ein paar Ausnahmen, wenn die Leute die falschen Eingaben in einige der Methoden geben. Wenn die Ausnahme ausgelöst wird, wird bei dem Verfahren eine der Code nach wie vor dem Wurf ausgeführt werden? Muss ich eine Pause nach dem Wurf setzen, oder hat ein Wurf immer die Methode verlassen?

War es hilfreich?

Lösung

Wenn Sie werfen eine Ausnahme, die nächster Code ausgeführt zu bekommen, ist jeder catch-Block, der diesen Wurf innerhalb des Verfahrens umfasst (falls vorhanden), dann die schließlich blockieren (falls vorhanden). Sie können versuchen, einen Try-Catch, eine Try-Catch-finally oder Try-endlich. Wenn dann die Ausnahme nicht behandelt wird, durch einen catch-Block erneut geworfen oder gar nicht gefangen, wird die Steuerung an den Aufrufer zurückgegeben. Zum Beispiel werden Sie „ja1, Ja2, Ja3“ von diesem Code erhalten ...

try
{
    Console.WriteLine("Yes1");
    throw (new Exception());
    Console.WriteLine("No1");

}
catch
{
    Console.WriteLine("Yes2");
    throw;
    Console.WriteLine("No2");
}
finally
{
    Console.WriteLine("Yes3");
}

Console.WriteLine("No3");

Andere Tipps

wirft den Stapel nach oben, wodurch das Verfahren beendet wird.

Ich empfehle Schreiten durch das Programm mit einem Debugger dann werden Sie selbst sehen, was los ist. Sehr nützlich für das Lernen!

Ich kam hier auf der Suche nach einer Antwort auf die ursprüngliche Post und fast verpasst eine sehr wertvolle Antwort gepostet von Eric Lippert . Hier ist seine Antwort in den Kommentaren geschrieben:

diese in drei Fragen aufgeteilt.

(1) Wird eine des Code in der Methode nach dem Wurf ausgeführt werden?
JA. Wenn die Ausnahme in einem try dann Code in passenden catch-Blöcke war oder finally-Block wird ausgeführt. Wenn es kein try-Block dann NO. Verzweigt die Steuerung an die nächste einschließende Schließlich fangen bzw. (vb) Ausnahmefilter versperren den Stapel.

(2) Muss ich nach dem Wurf eine Pause setzen?
Nein, nie. Der Endpunkt der throw-Anweisung ist nicht erreichbar; ein Wurf als goto vom Compiler behandelt. Eine Aussage unmittelbar nach einem Wurf ist nicht erreichbar und wird nie ausgeführt werden.

(3) Hat immer ein Wurf, das Verfahren beenden?
NEIN. Wenn der Wurf in einem Versuch ist und der Versuch hat einen passende catch-Block kann der catch-Block „fressen“ die Ausnahme. Nur wenn es kein catch-Block nicht die Ausnahme des Call-Stack ein nicht-lokal gehe nach oben tun.

Wenn Sie weitere Fragen zu diesem Thema haben, empfehle ich die C # Spezifikation zu lesen; all dieses Verhalten eindeutig dokumentiert ist.

Schließlich, es klingt wie Sie „boneheaded“ Ausnahmen werfen, wie in „Hey boneheaded Anrufer, ich sagte mir nie, dass die Daten geben“. Das ist toll, weil es Fehler in Anrufern verhindert. Aber wenn Sie das tun, sollten Sie sicherstellen, dass der Anrufer eine Möglichkeit hat, zu wissen, was Sie erwarten! Wenn der Anrufer nicht herausfinden können, ob Sie auf Ihrer Dokumentation zu werfen oder nicht, basierend gehen, dann haben Sie keine boneheaded Ausnahme gemacht, haben Sie eine ärgerliche Ausnahme gemacht. Siehe http://blogs.msdn.com/ericlippert /archive/2008/09/10/vexing-exceptions.aspx .

Wenn Sie Ihren Code in einem Try gewickelt haben ... Catch ... Finally-Block, dann wird der Code unter Schließlich wird immer ausgeführt werden. Zum Beispiel:

Try
  ' do some stuff here
  ' Examine user input
  If user input isn't valid
      Throw new exception
Catch
   Throw ' Just re-throws the same exception
Finally
   ' This code will execute, no matter what - exception or not
End Try

Als Nebenwirkung zu Ihrer eigentlichen Frage: Sie mögen vielleicht Ausnahmen zu überdenken mit Validierung Informationen zurück an den Benutzer zur Verfügung zu stellen

.

Ausnahmen anzuheben ist teuer ressourcen klug und langsam. Wenn Sie eine Reihe von Validierungsregeln, die Sie anwenden müssen, dann spezifischen Code für diese schreiben -. Sie sollten wahrscheinlich nur für Dinge, auf die Ausnahmebehandlung verlassen Sie nicht antizipieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top