7
votes

Dans un débogueur Java, comment ignorer les exceptions ne transmettant jamais mon code

Je suis actuellement en train d'utiliser Intellij Idea pour Java Development, mais je suis également intéressé par les réponses ciblant d'autres idées ou concepts généraux pour déboguer le code Java. Parce que ceci est une caractéristique que j'ai manquée dans un certain nombre d'idés, je ne suis pas sûr que si j'ai manqué un concept de flux de travail lors du transfert de mes habitudes de débogage d'autres langues. EM>

Disons que j'écris quelques Code dans MyApp. * code> Tout en utilisant des classes de cadre de somelib. * code>. Une trace de pile typique peut commencer dans l'ensemble de l'emballage et peut changer plusieurs fois entre eux. Disons également que je déboguise sous l'hypothèse selon laquelle il y a des bugs dans mon code em> et qu'il n'y en a pas dans le code de la bibliothèque em>. Un exemple de trace de pile (affichant uniquement les noms de classe): p>

somelib.D (current stack frame)
somelib.C
myapp.Y
myapp.X
somelib.B
somelib.A
  • jeté dans somelib.b code> et capturé dans somelib.a code>. Soit le code de la bibliothèque jette des exceptions pour gérer l'état problématique dans la bibliothèque ou arrêter l'application. Dans ce dernier cas, je ne suis intéressé que par le message d'exception qui, espérons-moi, me dit ce qui ne va pas. P> Li>

  • jeté dans somelib.d code> et pris dans somelib.c code>. Le code de la bibliothèque peut utiliser des exceptions comme une forme de logique lorsqu'une action certaine est essayée et une voie alternative est prise en cas de problème ou où mon code est notifié par le problème par d'autres moyens (par exemple, renvoyer une référence null si possible) . P> li> ul>

    types d'exceptions que je suis intéressé par: p>

    • jeté dans somelib.c code> ou somelib.d code> et non pris dans somelib.c code> ou somelib.d code>. Ici, je veux que le débogueur se casse sur la ligne dans myapp.y code> où j'appelle le code de somelib.c code>. P> l> li>

    • jeté dans myapp.x code> ou myApp.y code>, attrapé ou non capturé. Ici, je veux que le débogueur brute sur la ligne, l'exception soit lancée. P> li> ul>

      Intellij Idea Donne-moi les options pour sélectionner WeTher, je veux casser sur des exceptions attrapées ou non capturées, ou les deux et de restreindre l'emplacement où l'exception est jetée à un ensemble de classes. Ces options n'améliorent pas grand chose que je veux normalement rompre à une exception, mais non capturée ou non, tant que le code que j'ai écrit est entre l'endroit où il est jeté et l'endroit où il est attrapé fort>, éventuellement . p> p>


4 commentaires

J'ai reputé cette question directement sur Intellij Idea's Forum, je vais faire rapport une fois qu'il y a un mouvement là-bas: devnet.jetbrains.net/thread/289883


jeté dans somelib.c et pris dans somelib.d avez-vous voulu dire l'inverse?


@PIOLDODOBROGOST Oui, j'ai fait! Merci!


Dans Visual Studio Cette fonctionnalité est implémentée et appelée "juste mon code": docs.microsoft.com/en-us/visualstudio/debugger/... ..... et je vois que quelqu'un a déjà posté cela à votre question à Jetbrains: Intellij-Support.JetBrains.com/hc/en-us/community/posts/...


4 Réponses :


-2
votes

Utilisez Eclipse! À l'aide d'Eclipse, vous pouvez filtrer lorsque l'exception devrait arrêter le débogage à l'aide de propriétés de point d'arrêt.


1 commentaires

J'ai oublié de mentionner: pas d'éclipse! En fait, je ne m'entends pas très bien avec Eclipse, mais je vais jeter un coup d'œil à son débogueur Java. Merci!



2
votes

Vous pouvez créer deux interruptions d'exception:

  1. Un point d'arrêt d'exception qui frappe chaque fois qu'il y a une exception dans MyApp. * (capturé ou non capturé). Utilisez filtre de classe à cet effet (regardez ici pour les filtres de classe).
  2. Un point d'arrêt d'exception qui frappe chaque fois qu'il y a une exception non capturée dans «Somelib.c1 ou Somelib.b`. Utilisez à nouveau des filtres de classe pour limiter le point d'arrêt.

1 commentaires

1.: De ce que je comprends, un filtre de classe ne correspondra que des exceptions qui sont projetées par une instruction à l'intérieur des classes sélectionnées, par exemple, si la classe sélectionnée accède à un Java.util .List index qui est hors limites. 2: Cela ne fonctionne que tant que mon code n'est pas appelé par le code de la bibliothèque qui attire l'exception spécifique, c'est-à-dire que la fonction est appelée à l'intérieur d'un fil et des exceptions doivent être propagées en dehors du fil.



0
votes

Il semble être impossible de faire exactement ce que je voulais de manière pratique. Au moment de cette question, j'étais en train d'apprendre Java et de l'apprendre à mes collègues. Une solution simple aurait été favorable.

Mais avec mon expérience actuelle, il semble raisonnable d'utiliser l'approche suivante:

  1. Mettez attrape (Trowable T) autour de chaque corps de fil, c'est-à-dire au niveau supérieur de runnable.run () et statique principale (chaîne []) et enregistre ces exceptions "non capturées" à la console.
    • Les soins doivent être pris pour ne pas attraper accidentellement des exceptions vérifiées avec ces manipulateurs «Catch-tout», mais pour les gérer dans le cadre de la logique du programme.
    • Lorsque vous commencez à déboguer, ne créez aucun point d'arrêt d'exception.
    • dès qu'une exception est connectée à la console, créez un point d'arrêt d'exception pour cela et essayez de le faire être lancé à nouveau.
      • Cela ne devrait arriver que des exceptions non vérifiées (c'est-à-dire des sous-classes de RunTimeException ) car d'autres exceptions doivent être explicitement capturées et manipulées de toute façon.
      • comme attraper et gérer des exceptions décochées ne fait normalement pas partie de la logique d'un programme, créant ainsi ces points d'arrêt d'exception sans contraintes à la place qu'il est lancé ne devrait pas attraper des "faux positifs".

        Une alternative consiste à ignorer les deux dernières étapes et à créer un point d'arrêt d'exception pour RunTimeException . Mais cela a un changement plus élevé d'exceptions attrapantes qui sont capturées dans le cadre de la logique du programme.


0 commentaires

1
votes

in Intellij Vous pouvez définir une condition sur un exception Point de pause. La condition n'est que du code Java exécuté au moment où la rupture est touchée, l'objet d'exception serait donc dans la portée lors de la vérification des conditions. Vous pouvez appeler getStacktrace () à l'exception et décidez s'il s'agit d'une exception qui vous intéresse en regardant chaque image sur la pile. Si vous n'êtes pas intéressé, votre condition échoue et que le point d'arrêt est ignoré.


0 commentaires