【问题标题】:Android Studio IDE: Break on ExceptionAndroid Studio IDE:异常中断
【发布时间】:2014-09-03 07:58:14
【问题描述】:

默认情况下,我的 Android Studio 似乎不想中断任何异常。在“任何异常”上启用中断开始在实际的 JDE 库中中断。有什么方法可以强制它仅在我的代码中出现异常时中断?

来自 Visual Studio 世界,在此处寻找默认的 VS 调试行为。

【问题讨论】:

    标签: debugging exception android-studio breakpoints


    【解决方案1】:

    中断所有异常,无论捕获还是未捕获:

    1. 通过Run -> View Breakpoints打开Breakpoints窗口。
    2. 出现断点对话框。在左窗格中,滚动到底部。在 Java Exception Breakpoints 下选择 Any exception
    3. 选择任何异常,在右侧窗格中进行如下配置:
      • 暂停:选中
      • 全部:已选择
      • 条件:!(this instanceof java.lang.ClassNotFoundException)
      • 通知:Caught exceptionUncaught exception 均已选中

    1. 定义过滤器以指定调试器应该中断的库命名空间:选中类过滤器复选框以启用类过滤 (as mentioned by @Scott Barta)。然后单击 ...(省略号)按钮打开 Class Filters 对话框。通过单击(添加模式)按钮指定类命名空间模式。进入:
      • com.myapp.*(将其替换为您应用的命名空间前缀)
      • java.*(注意:根据 OP 的问题,不要在 Java 库上中断)
      • android.*(如上,只调试自己的应用代码)
      • 根据需要添加任何其他命名空间(例如 3rd 方库)

    1. 确定,然后关闭“断点”对话框。

    【讨论】:

    • @AndroidDev 这不是最好的界面,尤其是在使用 Visual Studio IDE 时。类过滤器是为了防止各种低级错误更频繁地停止应用程序(尤其是在应用程序初始化期间)。例如,按照上面的步骤,但没有类过滤器,然后在调试模式下启动应用程序,看看会发生什么。
    • @AndroidDev:我认为这实际上是有道理的。默认情况下,它确实 中断所有异常。您不必设置条件和过滤器。但是,OP 确实要求过滤异常(他自己的代码中的异常)。
    • 作为 xcode/iOS 开发人员和 android-n00b,我不知道为了触发任何断点,在 Android Studio 中,您不能单击类似播放(三角形)的图标来启动应用程序。您必须通过单击右侧旁边的类似错误的图标来启动应用程序。
    • @xaphod 另一种方法是在发布模式下运行(按下播放按钮),然后在应用程序启动后,附加调试器(通过按下带有错误的设备 - 带有绿色错误的纵向矩形图标右下角),然后选择要调试的进程。如果不调试任何应用程序启动代码,这会快得多。见:developer.android.com/tools/debugging/…
    • 如果您使用的是 junit(在单元测试时进行调试),您可能需要添加类过滤器 org.junit.*
    【解决方案2】:

    如果您打开“断点”窗口,它会为您提供很多选项来使其有条件地中断或不中断。您正在寻找的是此处的“类过滤器”——您可以使用例如 Java 包路径指定通配符表达式,它只会在匹配类生成的异常时中断。

    【讨论】:

    • 对于寻找断点窗口的任何人,都可以在菜单中找到它,运行 -> 查看断点。
    • 我正在尝试这个,但无法让它工作。类过滤器应该是什么?可以举一些例子吗?
    • 我在同一条船上 - 类过滤器似乎对我不起作用。我试过 com.mycompany.* 但没有一个异常会导致它崩溃。
    • 它每次都停在 ZygoteInit.java 中!很没用!怎么克服???
    • 运行->查看断点....是的,我们不希望在“查看”菜单下显示一个窗口,对吧!
    【解决方案3】:

    中断代码中的所有异常以及其他未捕获的异常:

    此方法过滤掉运行时在正常操作期间抛出的异常类型(不是很异常,是吗?)。它不使用类过滤器,因为它会过滤掉太多;代码中的错误通常会导致运行时类抛出异常(例如,访问末尾的数组列表)。

    1. 仅为未捕获异常启用Java Exception BreakPoints / Any exception

    2. Exception (java.lang) 类添加一个新的Java Exception BreakPoint,用于捕获和未捕获 异常。启用 Condition 并将其设置为:

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

    将您遇到的任何其他非异常异常添加到条件中的排除列表中。 (顺便说一句,使用java.lang.Exception 是一种有效地获得第二个“任何异常”条目的方法。)

    【讨论】:

    • 最好用 !( a || b || c ) 代替 !(a) && !(b) && !(c)
    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2011-08-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多