Android Studio IDE: Pause bei Ausnahme

138

Es scheint, dass mein Android Studio standardmäßig keine Ausnahme machen möchte. Wenn Sie die Unterbrechung für "Beliebige Ausnahme" aktivieren, wird die Unterbrechung innerhalb der tatsächlichen JDE-Bibliotheken unterbrochen. Gibt es eine Möglichkeit, es zu zwingen, nur bei Ausnahmen innerhalb meines Codes zu brechen?

Sie stammen aus dem Visual Studio-Universum und suchen hier nach dem Standard-VS-Debug-Verhalten.

AlexVPerl
quelle

Antworten:

206

Um alle Ausnahmen zu brechen, gefangen oder nicht gefangen:

  1. Öffnen Sie das Fenster Haltepunkte über Ausführen -> Haltepunkte anzeigen .
  2. Das Dialogfeld Haltepunkte wird angezeigt. Scrollen Sie im linken Bereich nach unten. Wählen Sie unter Java-Ausnahme-Haltepunkte die Option Beliebige Ausnahme aus
  3. Mit Jeder Ausnahme im rechten Fensterbereich ausgewählt, folgt, configure wie:
    • Anhalten: aktiviert
    • Alle ausgewählt
    • Bedingung: !(this instanceof java.lang.ClassNotFoundException)
    • Hinweise: beide Exception abgefangen und abgefangene Ausnahme ausgewählt

Haltepunktdialog

  1. Definieren Sie Filter, die Namespaces von Bibliotheken angeben, für die der Debugger unterbrochen werden soll : Aktivieren Sie das Kontrollkästchen Klassenfilter , um die Klassenfilterung zu aktivieren ( wie von @Scott Barta erwähnt ). Klicken Sie dann auf die Schaltfläche ... (Auslassungspunkte), um das Dialogfeld Klassenfilter zu öffnen. Geben Sie Klassennamensraummuster an, indem Sie auf die Muster hinzufügenSchaltfläche (Muster hinzufügen) klicken . Eingeben:
    • com.myapp.* (Ersetzen Sie dies durch das Namespace-Präfix Ihrer App.)
    • java.* (Hinweis: Lassen Sie dies gemäß der Frage des OP weg, um die Java-Bibliotheken NICHT zu beschädigen.)
    • android.* (Wie oben, lassen Sie es aus, nur den eigenen App-Code zu debuggen.)
    • Fügen Sie nach Bedarf zusätzliche Namespaces hinzu (z. B. Bibliotheken von Drittanbietern).

Klassenfilter

  1. Drücken Sie OK und schließen Sie das Dialogfeld Haltepunkte.
CJBS
quelle
6
@AndroidDev Es ist nicht die schönste Oberfläche, insbesondere wenn Sie die Visual Studio-IDE verwenden. Die Klassenfilter sollen verhindern, dass alle Arten von Fehlern auf niedriger Ebene die Anwendung viel häufiger stoppen (insbesondere während der App-Initialisierung). Befolgen Sie als Beispiel die obigen Schritte, jedoch ohne die Klassenfilter, und starten Sie die App im Debug-Modus, um zu sehen, was passiert.
CJBS
6
@AndroidDev: Ich denke, es macht tatsächlich Sinn. Standardmäßig es nicht auf alle Ausnahme brechen. Sie müssen keine Bedingungen und Filter festlegen. Das OP hat jedoch speziell um das Filtern von Ausnahmen gebeten (Ausnahmen in seinem eigenen Code).
Mooing Duck
4
Als Xcode / iOS-Entwickler und Android-N00B wusste ich nicht, dass Sie in Android Studio nicht auf das spielähnliche (Dreieck) Symbol klicken können, um die App zu starten, damit JEDE Haltepunkte ausgelöst werden. Sie müssen die App starten, indem Sie auf das fehlerhafte Symbol rechts daneben klicken.
Xaphod
@xaphod Eine andere Möglichkeit besteht darin, im Freigabemodus zu arbeiten (drücken Sie die Wiedergabetaste). Wenn die App gestartet wurde, hängen Sie den Debugger an (indem Sie auf das Gerät mit dem Fehler-Porträt-Rechteck mit dem grünen Fehler unten rechts im Symbol drücken) und wählen Sie dann aus der zu debuggende Prozess. Dies ist viel schneller, wenn Sie keinen App-Startcode debuggen. Siehe: developer.android.com/tools/debugging/…
CJBS
Wenn Sie junit verwenden (Debuggen während Unit-Tests), möchten Sie möglicherweise den Klassenfilter hinzufügenorg.junit.*
Thomas Vincent
34

Wenn Sie das Fenster Haltepunkte öffnen, haben Sie einige Möglichkeiten, es bedingt zu unterbrechen oder nicht. Was Sie suchen, sind die "Klassenfilter" hier - Sie können einen Platzhalterausdruck mit beispielsweise einem Java-Paketpfad angeben, der nur für Ausnahmen unterbrochen wird, die aus übereinstimmenden Klassen generiert wurden.

Scott Barta
quelle
4
Wenn Sie nach dem Fenster Haltepunkte suchen, finden Sie es im Menü Ausführen -> Haltepunkte anzeigen.
Patrick
2
Ich versuche das, kann es aber nicht zum Laufen bringen. Was soll der Klassenfilter sein? Könnten Sie einige Beispiele geben?
Bart Friederichs
1
Ich bin im selben Boot - die Klassenfilter scheinen für mich einfach nicht zu funktionieren. Ich habe com.mycompany ausprobiert. *, Aber keine der Ausnahmen führt dazu, dass es kaputt geht.
Kylotan
Es stoppt jedes Mal in ZygoteInit.java! Ziemlich nutzlos! Wie kann man das überwinden ???
Renaud Cerrato
Run-> View Breakpoints .... ja, wir möchten nicht, dass ein Fenster unter dem Menü "View" angezeigt wird, oder?
LarryBud
7

So brechen Sie alle Ausnahmen in Ihrem Code und andere Ausnahmen ab, wenn sie nicht erfasst werden:

Diese Methode filtert die Ausnahmetypen heraus, die die Laufzeit während des normalen Betriebs auslöst (nicht sehr außergewöhnlich, oder?). Der Klassenfilter wird nicht verwendet, da er zu viel herausfiltern würde. Fehler in Ihrem Code führen häufig dazu, dass Laufzeitklassen Ausnahmen auslösen (z. B. Zugriff auf eine Array-Liste nach dem Ende).

  1. Aktivieren Sie Java Exception BreakPoints / Jede Ausnahme nur für nicht erfasste Ausnahmen.

  2. Fügen Sie einen neuen Java Exception BreakPoint für die Exception (java.lang)Klasse für abgefangene und nicht erfasste Ausnahmen hinzu. Aktivieren Sie die Bedingung und setzen Sie sie auf Folgendes:

        !(this instanceof java.lang.ClassNotFoundException || this instanceof android.system.ErrnoException || this instanceof java.io.FileNotFoundException || this instanceof javax.net.ssl.SSLHandshakeException || this instanceof javax.net.ssl.SSLPeerUnverifiedException || this instanceof android.system.GaiException || this instanceof java.net.SocketTimeoutException || this instanceof java.net.SocketException || this instanceof java.security.NoSuchAlgorithmException)
    

Fügen Sie der Ausschlussliste unter der Bedingung alle anderen nicht außergewöhnlichen Ausnahmen hinzu, auf die Sie stoßen. (Übrigens ist die Verwendung java.lang.Exceptioneine Möglichkeit, effektiv einen zweiten Eintrag "Jede Ausnahme" zu erhalten.)

Edward Brey
quelle
nicht besser zu verwenden! (a || b || c) anstelle von! (a) &&! (b) &&! (c)
ceph3us