Android Studio IDE: przerwa w przypadku wyjątku

142

Wygląda na to, że moje Android Studio nie chce domyślnie przerywać żadnego wyjątku. Włączenie przerwy w „Dowolnym wyjątku” zaczyna działać w rzeczywistych bibliotekach JDE. Czy istnieje sposób, aby zmusić go do łamania tylko w wyjątkach tylko w moim kodzie?

Pochodzę ze wszechświata programu Visual Studio, szukam tutaj domyślnego zachowania debugowania VS.

AlexVPerl
źródło

Odpowiedzi:

212

Aby złamać wszystkie wyjątki, złapany lub nie złapany:

  1. Otwórz okno Breakpoints poprzez Run -> View Breakpoints .
  2. Zostanie wyświetlone okno dialogowe Punkty przerwania. W lewym okienku przewiń w dół. Wybierz opcję Dowolny wyjątek w obszarze Punkty przerwania wyjątków Java
  3. Po wybraniu dowolnego wyjątku w prawym okienku skonfiguruj w następujący sposób:
    • Zawieszenie: zaznaczone
    • Wszystkie: wybrane
    • Stan: schorzenie: !(this instanceof java.lang.ClassNotFoundException)
    • Powiadomienia: wybrano zarówno przechwycony wyjątek, jak i nieprzechwycony wyjątek

Okno dialogowe punktów przerwania

  1. Zdefiniuj filtry określające przestrzenie nazw bibliotek, w przypadku których debugger powinien przerwać: Zaznacz pole wyboru Filtry klas, aby włączyć filtrowanie klas (o czym wspomniał @Scott Barta ). Następnie kliknij przycisk ... (elipsis), aby otworzyć okno dialogowe Filtry klas. Określ wzorce przestrzeni nazw klas, klikając przycisk Dodaj wzór(Dodaj wzorzec). Wchodzić:
    • com.myapp.* (zastąp to prefiksem przestrzeni nazw swojej aplikacji)
    • java.* (uwaga: zgodnie z pytaniem OP, pozostaw to, aby NIE zepsuć się w bibliotekach Java)
    • android.* (jak powyżej, pomiń debugowanie własnego kodu aplikacji)
    • W razie potrzeby dodaj dodatkowe przestrzenie nazw (np. Biblioteki innych firm)

Filtry klas

  1. Naciśnij OK , a następnie zamknij okno dialogowe Punkty przerwania.
CJBS
źródło
6
@AndroidDev To nie jest najprzyjemniejszy interfejs, szczególnie jeśli korzystasz z Visual Studio IDE. Filtry klas mają zapobiegać częstszemu zatrzymywaniu aplikacji przez różnego rodzaju błędy niskiego poziomu (szczególnie podczas inicjowania aplikacji). Na przykład wykonaj powyższe kroki, ale bez filtrów klas, a następnie uruchom aplikację w trybie debugowania i zobacz, co się stanie.
CJBS
6
@AndroidDev: Myślę, że to ma sens. Domyślnie nie działa przy wszystkich wyjątkach. Nie musisz ustawiać warunków ani filtrów. Jednak PO poprosił konkretnie o filtrowanie wyjątków (wyjątków we własnym kodzie).
Mooing Duck
5
Jako programista xcode / iOS i android-n00b nie wiedziałem, że aby uruchomić JAKIEKOLWIEK punkt przerwania, w Android Studio nie możesz kliknąć ikony przypominającej grę (trójkąt), aby uruchomić aplikację. Musisz uruchomić aplikację, klikając ikonę przypominającą błąd po prawej stronie.
xaphod
@xaphod Innym sposobem jest uruchomienie w trybie wydania (naciśnij przycisk odtwarzania), a następnie po uruchomieniu aplikacji podłącz debugger (naciskając urządzenie z błędem - prostokąt portretowy z zielonym błędem w prawym dolnym rogu ikony), a następnie wybierz proces do debugowania. Jest to znacznie szybsze, jeśli nie debuguje żadnego kodu startowego aplikacji. Zobacz: developer.android.com/tools/debugging/…
CJBS,
Jeśli używasz junit (debugowanie podczas testów jednostkowych), możesz dodać filtr klasorg.junit.*
Thomas Vincent
34

Jeśli otworzysz okno Punkty przerwania, daje to kilka opcji warunkowego przerwania lub nie. To, czego szukasz, to „Filtry klas” - możesz określić wyrażenie wieloznaczne, na przykład ze ścieżką pakietu Java, i będzie ono przerywane tylko w przypadku wyjątków wygenerowanych z pasujących klas.

Scott Barta
źródło
4
Dla każdego, kto szuka okna Breakpoints, można je znaleźć w menu Run -> View Breakpoints.
Patrick
2
Próbuję tego, ale nie mogę zmusić tego do pracy. Jaki powinien być filtr klas? Czy mógłbyś podać kilka przykładów?
Bart Friederichs
1
Jestem na tej samej łodzi - wydaje mi się, że filtry klasowe nie działają. Próbowałem com.mycompany. *, Ale żaden z wyjątków nie powoduje awarii.
Kylotan
Po prostu zatrzymuje się za każdym razem w ZygoteInit.java! Całkiem bezużyteczne! Jak to przezwyciężyć ???
Renaud Cerrato
Uruchom-> Wyświetl punkty przerwania .... tak, nie chcielibyśmy, aby okno było wyświetlane w menu „Widok”, prawda!
LarryBud,
7

Aby przerwać wszystkie wyjątki w kodzie i inne wyjątki, jeśli nie zostały złapane:

Ta metoda odfiltrowuje typy wyjątków, które środowisko uruchomieniowe zgłasza podczas normalnej pracy (niezbyt wyjątkowe, prawda?). Nie używa filtru klas, ponieważ odfiltrowałby zbyt dużo; błędy w kodzie często powodują, że klasy środowiska wykonawczego generują wyjątki (np. dostęp do listy tablic po zakończeniu).

  1. Włącz punkty przerwania wyjątków Java / dowolny wyjątek tylko dla nieprzechwyconych wyjątków.

  2. Dodaj nowy punkt przerwania wyjątku Java dla Exception (java.lang)klasy dla wychwyconych i nieprzechwyconych wyjątków. Włącz warunek i ustaw go na:

        !(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)
    

Dodaj do listy wykluczeń w warunku wszelkie inne nietypowe wyjątki, które napotkasz. (Swoją java.lang.Exceptiondrogą , używanie jest sposobem na efektywne uzyskanie drugiego wpisu „Każdy wyjątek”).

Edward Brey
źródło
nie lepiej używać! (a || b || c) zamiast! (a) &&! (b) &&! (c)
ceph3us