IDE Android Studio: pause sur exception

139

Il semble que mon Android Studio ne souhaite pas interrompre une exception par défaut. L'activation de la pause sur "Toute exception" commence à se rompre dans les bibliothèques JDE réelles. Existe-t-il un moyen de le forcer à ne casser que sur les exceptions dans mon code uniquement?

Provenant de l'univers Visual Studio, recherchez le comportement de débogage VS par défaut ici.

AlexVPerl
la source

Réponses:

206

Pour casser sur toutes les exceptions, attrapées ou non interceptées:

  1. Ouvrez la fenêtre Breakpoints via Exécuter -> Afficher les points d'arrêt .
  2. La boîte de dialogue Points d'arrêt s'affiche. Dans le volet gauche, faites défiler vers le bas. Sélectionnez Toute exception sous Java Exception Breakpoints
  3. Avec Toute exception sélectionnée, dans le volet droit, configurez comme suit:
    • Suspendre: coché
    • Tout: sélectionné
    • État: !(this instanceof java.lang.ClassNotFoundException)
    • Notifications: exception interceptée et exception non interceptée sélectionnées

Boîte de dialogue Points d'arrêt

  1. Définissez des filtres qui spécifient les espaces de noms des bibliothèques sur lesquels le débogueur doit s'arrêter : Cochez la case Filtres de classe pour activer le filtrage de classe ( comme mentionné par @Scott Barta ). Cliquez ensuite sur le bouton ... (elipsis) pour ouvrir la boîte de dialogue Filtres de classe. Spécifiez les modèles d'espace de noms de classe en cliquant sur leAjouter un motif (Ajouter un modèle). Entrer:
    • com.myapp.* (remplacez-le par le préfixe d'espace de noms de votre application)
    • java.* (Remarque: selon la question de OP, laissez ceci de côté pour ne PAS casser sur les bibliothèques Java)
    • android.* (comme ci-dessus, laissez de côté simplement déboguer le code de l'application)
    • Ajoutez des espaces de noms supplémentaires si nécessaire (par exemple des bibliothèques tierces)

Filtres de classe

  1. Appuyez sur OK , puis fermez la boîte de dialogue Points d'arrêt.
CJBS
la source
6
@AndroidDev Ce n'est pas la meilleure interface, en particulier lorsque vous utilisez l'IDE de Visual Studio. Les filtres de classe empêchent toutes sortes d'erreurs de bas niveau d'arrêter l'application beaucoup plus fréquemment (en particulier lors de l'initialisation de l'application). À titre d'exemple, suivez les étapes ci-dessus, mais sans les filtres de classe, puis démarrez l'application en mode débogage et voyez ce qui se passe.
CJBS
6
@AndroidDev: Je pense que cela a du sens en fait. Par défaut, il s'arrête sur toutes les exceptions. Vous n'êtes pas obligé de définir des conditions et des filtres. Cependant, l'OP a demandé spécifiquement le filtrage des exceptions (exceptions dans son propre code).
Mooing Duck
5
En tant que développeur xcode / iOS et android-n00b, je ne savais pas que pour que TOUT point d'arrêt se déclenche, dans le studio Android, vous ne pouvez pas cliquer sur l'icône de lecture (triangle) pour démarrer l'application. Vous devez démarrer l'application en cliquant sur l'icône en forme de bogue à côté d'elle sur la droite.
xaphod
@xaphod Une autre façon est d'exécuter en mode release (appuyez sur le bouton play), puis une fois que l'application a démarré, attachez le débogueur (en appuyant sur l'appareil avec le bogue - rectangle portrait avec bogue vert en bas à droite de l'icône), puis sélectionnez le processus à déboguer. C'est beaucoup plus rapide si vous ne déboguez aucun code de démarrage de l'application. Voir: developer.android.com/tools/debugging
...
Si vous utilisez junit (débogage pendant les tests unitaires), vous voudrez peut-être ajouter le filtre de classeorg.junit.*
Thomas Vincent
34

Si vous ouvrez la fenêtre Breakpoints, cela vous donne de nombreuses options pour qu'elle soit conditionnée ou non. Ce que vous recherchez, ce sont les "filtres de classe" ici - vous pouvez spécifier une expression générique avec, par exemple, un chemin de package Java, et elle ne sera interrompue que pour les exceptions générées à partir des classes correspondantes.

Scott Barta
la source
4
Pour tous ceux qui recherchent la fenêtre Breakpoints, elle peut être trouvée dans le menu, Run -> View Breakpoints.
Patrick
2
J'essaye ceci, mais je n'arrive pas à le faire fonctionner. Quel devrait être le filtre de classe? Pouvez-vous donner quelques exemples?
Bart Friederichs
1
Je suis dans le même bateau - les filtres de classe ne semblent tout simplement pas fonctionner pour moi. J'ai essayé com.mycompany. * Mais aucune des exceptions ne provoque sa rupture.
Kylotan
Il s'arrête à chaque fois dans ZygoteInit.java! Assez inutile! Comment surmonter ça ???
Renaud Cerrato
Exécuter-> Afficher les points d'arrêt .... ouais, nous ne voudrions pas qu'une fenêtre soit affichée dans le menu "Affichage", n'est-ce pas!
LarryBud
7

Pour annuler toutes les exceptions de votre code et autres exceptions si non interceptées:

Cette méthode filtre les types d'exceptions que le runtime lève pendant le fonctionnement normal (pas très exceptionnel, n'est-ce pas?). Il n'utilise pas le filtre de classe, car il filtrerait trop; les bogues dans votre code provoquent souvent des exceptions par les classes d'exécution (par exemple, accéder à une liste de tableaux après la fin).

  1. Activez les points d'arrêt d'exception Java / toute exception pour les exceptions non interceptées uniquement.

  2. Ajoutez un nouveau point d' arrêt d'exception Java pour la Exception (java.lang)classe pour les exceptions interceptées et non interceptées . Activez la condition et réglez-la sur ceci:

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

Ajoutez à la liste d'exclusion dans la condition toutes les autres exceptions non exceptionnelles que vous rencontrez. (BTW, l'utilisation java.lang.Exceptionest un moyen d'obtenir efficacement une deuxième entrée "Toute exception".)

Edward Brey
la source
pas mieux d'utiliser! (a || b || c) au lieu de! (a) &&! (b) &&! (c)
ceph3us