Eine Zeit lang hatte ich eine komplizierte Regelung, die in etwa wie folgt beteiligt:
try(Closeable ignore = Debugger.newBreakSuppression())
{
... library call which may throw ...
} <-- exception looks like it is thrown here
Das erlaubte mir nie von Ausnahmen belästigt werden, die innerhalb Bibliothek Anrufe geworfen und geschluckt wurden. Wenn eine Ausnahme von einem Bibliotheksaufruf ausgelöst wurde und nicht abgefangen wurde, würde es so aussehen, als wäre sie in der schließenden geschweiften Klammer aufgetreten.
Die Art und Weise war es funktionierte wie folgt:
Closeable
eine Schnittstelle, die AutoCloseable
ohne Deklaration erstreckt, ist jede Ausnahmen geprüft.
ignore
ist nur ein Name, der IntelliJ IDEA sagt, sich nicht über die unbenutzte Variable zu beschweren, und es ist notwendig, weil albernes Java try(Debugger.newBreakSuppression())
nicht unterstützt.
Debugger
ist meine eigene Klasse mit Debugging-verwandten Hilfsmethoden.
newBreakSuppression()
war eine Methode, die eine Thread-lokale Instanz von einigen BreakSuppression
Klasse erstellen würde, die die Tatsache zur Kenntnis nehmen, dass wir Break-on-Ausnahme vorübergehend ausgesetzt werden möchten.
Dann hatte ich eine Ausnahme Haltepunkt mit einer Pause Bedingung, dass meine Debugger
Klasse aufrufen würde zu fragen, ob es in Ordnung ist, zu brechen, und die Debugger
Klasse würde mit einem „Nein“, wenn irgendwelche BreakSuppression
Objekte wurden instanziiert reagieren.
Das war extrem kompliziert, weil die VM Ausnahmen auslöst, bevor mein Code geladen wurde, so dass der Filter während des Programmstarts nicht ausgewertet werden konnte und der Debugger ein Popup-Fenster öffnen würde, anstatt es zu ignorieren. (Ich beschwere mich nicht, ich hasse stille Fehler.) Also musste ich einen schrecklichen, schrecklichen, nicht-versuchen-dieses-zu-Hause-Hack haben, wo die Unterbrechungsbedingung so aussehen würde: java.lang.System.err.equals(this)
Normalerweise, das würde niemals true zurückgeben, weil System.err
ungleich einer ausgelösten Ausnahme ist, deshalb würde der Debugger niemals brechen. Wenn jedoch meine Klasse Debugger
initialisiert würde, würde sie System.err
durch eine eigene Klasse ersetzen, die eine Implementierung für equals(Object)
lieferte und true
zurückgab, wenn der Debugger brechen sollte. Im Wesentlichen benutzte ich System.err
als eine ewige globale Variable.
Schließlich habe ich dieses ganze Schema aufgegeben, weil es übermäßig kompliziert ist und sehr schlecht läuft, weil Ausnahmen sehr oft im Java-Ökosystem auftreten, also einen Ausdruck jedes Mal auszuwerten, wenn eine Ausnahme ausgelöst wird, verlangsamt alles enorm.
Analoge Frage in Bezug auf Java - [In einem Java-Debugger, wie Ausnahmen ignorieren nie durch meinen Code] (http://stackoverflow.com/q/3335587/95735) –