【问题标题】:How do I prevent exception catching in Android?如何防止在 Android 中捕获异常?
【发布时间】:2011-03-17 17:28:13
【问题描述】:

我正在尝试开发适用于 Android 的应用程序,但在跟踪我在此过程中遇到的每个异常的来源和原因时遇到了困难。 我的代码在 Activity 中运行,如果我的一行导致异常,则不是在该行上停止并突出显示它,而是将我扔到 ActivityThread 类的代码中,显然我没有,所以我只是得到一个“找不到源”屏幕。

试图找到这样的麻烦行非常令人沮丧,所以我试图找到一种方法来防止Android的代码在开发过程中捕获每个异常。 我在网上的搜索没有提供关于我如何做到这一点的信息,所以我决定在这里问。

这是在我的代码中引发异常之前的堆栈跟踪:

线程 [ main](暂停 (GameView 中第 72 行的断点))
GameView.showMenu() 行:72
GameView.init() 行:59
游戏视图。(上下文, AttributeSet) 行:51
Constructor.constructNative(对象[], Class, Class[], int, boolean) 行: 不可用 [本机方法] Constructor.newInstance(对象...) 线路:415 PhoneLayoutInflater(LayoutInflater).createView(String, 字符串,属性集)行:505
PhoneLayoutInflater(LayoutInflater).createViewFromTag(String, AttributeSet) 行:570
PhoneLayoutInflater(LayoutInflater).rInflate(XmlPullParser, 视图,属性集)行:623 PhoneLayoutInflater(LayoutInflater).inflate(XmlPullParser, ViewGroup,布尔值)行:408 PhoneLayoutInflater(LayoutInflater).inflate(int, ViewGroup,布尔值)行:320 PhoneLayoutInflater(LayoutInflater).inflate(int, ViewGroup) 线路:276
PhoneWindow.setContentView(int) 行: 207
MainActivity(Activity).setContentView(int) 线路:1657
MainActivity.onCreate(Bundle) 行: 20
Instrumentation.callActivityOnCreate(活动, 捆绑)线路:1047
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, 意图)线路:1586
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, 意图)线路:1638
ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClientRecord, 意图)线:117 ActivityThread$H.handleMessage(消息) 线路:928 ActivityThread$H(Handler).dispatchMessage(Message) 行:99 Looper.loop() 行:123 ActivityThread.main(String[]) 行: 第3647章 对象[],类,类[],类,整数, boolean) 行:不可用 [native 方法] Method.invoke(对象, 对象...)行:507
ZygoteInit$MethodAndArgsCaller.run() 行:839 ZygoteInit.main(字符串 []) 行:597 NativeStart.main(字符串 []) 行:不可用[本机方法]

这是 Eclipse 因异常而停止执行后的堆栈跟踪:

线程 [ main](暂停 (异常运行时异常)) ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, 意图)线路:1622
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, 意图)线路:1638
ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClientRecord, 意图)线:117 ActivityThread$H.handleMessage(消息) 线路:928 ActivityThread$H(Handler).dispatchMessage(Message) 行:99 Looper.loop() 行:123 ActivityThread.main(String[]) 行: 第3647章 对象[],类,类[],类,整数, boolean) 行:不可用 [native 方法] Method.invoke(对象, 对象...)行:507
ZygoteInit$MethodAndArgsCaller.run() 行:839 ZygoteInit.main(字符串 []) 行:597 NativeStart.main(字符串 []) 行:不可用[本机方法]

任何帮助将不胜感激。

【问题讨论】:

    标签: android exception exception-handling


    【解决方案1】:

    当调试器这样中断时,继续执行(可能需要执行 2 或 3 次)。然后查看 LogCat 输出以获取有意义的堆栈跟踪。

    【讨论】:

    • 谢谢,这有帮助。继续执行几次后,我确实可以在 LogCat 输出中看到一堆错误消息,其中包括专门指出 my 代码中引发异常的位置的行。我什至可以双击它,它把我带到了我代码中的那一行。 =)
    【解决方案2】:

    在我看来,您应该将有问题的代码包装在 try/catch 块中,这样您就可以 (A) 优雅地处理异常,并且 (B) 能够在 catch 块中设置断点并检查您的变量,同时调试。还是我误会了?

    编辑:

    举个例子,如果你有一个 Activity 并且你在你的 onCreate 中(我的 Android-fu 有点生锈)而且它是

    public void onCreate(Bundle blahblah) {
      My code here
    }
    

    你会这样做

    public void onCreate(Bundle blahblah) {
      try { 
        My code here
      } catch (Exception e) {
        Log.d(Do something to print your stacktrace here); <-- Set your breakpoint here
      }
    }
    

    【讨论】:

    • 如果我不知道哪个方法导致问题,我就不能这样做,而且我不能为了调试而用 try/catch 块包装每个方法实现。
    • MainActivity.onCreate 中的第 20 行似乎是一个不错的起点。
    【解决方案3】:

    堆栈跟踪中的第一行显示它在哪里爆炸。在你的情况下:

    Thread [<1> main] (Suspended (breakpoint at line 72 in GameView))
    GameView.showMenu() line: 72
    GameView.init() line: 59
    GameView.(Context, AttributeSet) line: 51
    

    【讨论】:

    • 正如我所说,堆栈跟踪是在抛出异常之前之前的,我之前故意停在这条线上。只有当我已经知道是哪条线路导致问题时,我才能这样做,而这正是我想知道的。
    【解决方案4】:

    对我来说,该输出看起来不像是异常的堆栈跟踪。从调试的角度来看,这就像Thread 信息。尝试在 ddms 透视图或 ddms 独立工具中使用 logcat 来查看引发的实际异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2010-09-26
      • 2023-03-31
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多