Frage

Vor kurzem hatte ich ein zusätzliches Modul für einen bestehenden Service von einem Kollegen entwickelt zu entwickeln. Er hatte einen try / catch-Block in der Hauptarbeits Funktion platziert alle unhadled Ausnahmen für den Fang, die auf diese Ebene sprudelte, sie zusammen mit Stack-Trace-Info usw. Anmeldung:

try
{
    // do main work
}
catch(Exception ex)
{
    // log exception info
}

Während dies das Programm sehr stabil macht (wie in ‚unwahrscheinlich abstürzen‘), ich hasse es, weil, wenn ich meinen Code mich entschieden, ich habe nicht die Ausnahmen sehen durch sie verursacht. Natürlich kann ich im Ausnahmeprotokoll und sehen, ob es neue Einträge vorhanden sind, aber ich ziehe es sehr, ein direktes Feedback die Ausnahme in dem Moment sie geworfen zu bekommen (im Code auf der rechten Linie mit dem Cursor, bitte).

Ich entfernte diese Top-Level-try / catch zumindest während ich noch Codierung und Testen. Aber jetzt ist meine Aufgabe beendet, und ich habe zu entscheiden ob es für die Freigabe in zurück zu setzen, oder nicht. Ich denke, dass ich es tun soll, weil es den Service stabiler macht, und der ganze Sinn davon ist, dass es im Hintergrund ausgeführt wird, ohne eine Aufsicht zu benötigen. Auf der anderen Seite habe ich gelesen, dass man nur bestimmte Ausnahmen (wie in IoException) nennen sollte, nicht allgemein Exception.

Was ist Ihr Rat zu diesem Thema?

Durch die Art und Weise wird das Projekt in C # geschrieben, aber ich interessiere mich auch für Antworten für nicht .NET-Sprachen.

War es hilfreich?

Lösung

Legen Sie es zurück.

Die Ausnahme sollte nur dann relevant, während des Tests sein. Ansonsten macht es keinen Sinn es für den Benutzer machen Pop.

Die Protokollierung ist in Ordnung.

Sie können zusätzlich das Symbol DEBUG von Visual Studio definiert verwenden für Debug als Flag baut.

    ...
    } catch( Exception e ) { 
#if DEBUG
          throw;
#else
          log as usual 
#endif
    }

Also das nächste Mal, wenn eine Änderung der Debug-Flag benötigt wird, sollte auf true und die Ausnahme festgelegt werden wird angezeigt.

Andere Tipps

In jeder Java-Anwendung, die Sie gerade über immer wollen einen Exception-Handler für nicht abgefangene Ausnahmen mit etwas wie folgt definieren:

Thread.setDefaultUncaughtExceptionHandler( ... );

, wo das Objekt, das diese nicht abgefangene Ausnahmen fangen wird zumindest das Scheitern einzuloggen, so dass Sie eine Chance haben, darüber zu wissen. Ansonsten gibt es keine Garantie, dass Sie auch benachrichtigt werden, dass ein Thread eine Ausnahme war -. Nicht, wenn es Ihr Hauptthread

Darüber hinaus, dies zu tun, die meisten meiner Fäden haben einen try / catch, wo ich RunnableException fangen werden (aber Error nicht) und melden Sie es ... einige Themen werden sterben, wenn dies geschieht, werden andere protokollieren und ignorieren, andere entscheiden, je nach den Bedürfnissen der Anwendung wird eine Beschwerde an den Benutzer angezeigt werden und die Benutzer lassen. Dieser Versuch / Haken ist an der Wurzel des Gewindes, in dem Runnable.run() Verfahren oder gleichwertig. Da die try / catch an der Wurzel des Gewindes ist, gibt es keine Notwendigkeit, manchmal diesen Fang zu deaktivieren.

Wenn ich in C # zu schreiben, I-Code in ähnlicher Weise. Aber das hängt alles von der Notwendigkeit der Anwendung. Ist die Ausnahme einer, die beschädigten Daten? Na, dann nicht fangen und ignoriert es. Melden Sie sich immer, aber dann die Anwendung sterben lassen. Die meisten Ausnahmen sind nicht von dieser Art, aber.

Im Idealfall mögen Sie eine Ausnahme so nahe zu handhaben, wo es als möglich aufgetreten, aber das bedeutet nicht ein globaler Exception-Handler ist eine schlechte Idee. Besonders für einen Dienst, der unter allen Umständen bleiben laufen muss. Ich würde auch weiterhin, was Sie getan haben. Deaktivieren Sie es beim Debuggen, aber lassen Sie es an Ort und Stelle für die Produktion.

Beachten Sie sollte es als Sicherheitsnetz verwendet werden. Immer noch versuchen, alle Ausnahmen zu fangen, bevor sie so weit erhöhen.

Der Drang, alle Ausnahmen zu fangen und das Programm ‚stabil‘ zu machen ist sehr stark, und die Idee scheint sehr verlockend in der Tat für alle. Das Problem, wie Sie darauf hinweisen, dass dies nur ein Trick, und das Programm kann Buggy und schlimmer noch, w / o Hinweise auf Ausfälle sehr gut sein. Niemand überwacht die Protokolle regelmäßig.
Mein Rat wäre, die anderen Entwickler zu versuchen und zu überzeugen, umfangreiche Tests zu tun und es dann in der Produktion einsetzt w / o der Außen fangen.

Wenn Sie die Ausnahme sehen wollen, wenn es auftritt, in Visual Studio können Sie das Debug-Menü gehen, wählen Sie AUSNAHMEN und Sie können den Debugger sagen, so schnell zu brechen, wie eine Ausnahme ausgelöst wird. Sie erhalten auch, welche Art von Ausnahmen zu holen. :)

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