线程中的异常将写入System.err而不是被捕获

时间:2011-08-14 17:56:03

标签: java android exception exception-handling

我已经看过它已经发生了几次但是我似乎无法找到任何提及。在这种情况下,我正在进行网络操作,在不解析主机时,工作线程死亡,logcat显示以下内容:

Warning System.err  8/14/2011 8:41:58 PM    4355    java.net.UnknownHostException: Unable to resolve host "q": No address associated with hostname
Warning System.err  8/14/2011 8:41:58 PM    4355    at java.net.InetAddress.lookupHostByName(InetAddress.java:496)
Warning System.err  8/14/2011 8:41:58 PM    4355    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
Warning System.err  8/14/2011 8:41:58 PM    4355    at java.net.InetAddress.getAllByName(InetAddress.java:249)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
Warning System.err  8/14/2011 8:41:58 PM    4355    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
...
Warning dalvikvm    8/14/2011 8:41:58 PM    4355    threadid=10: thread exiting with uncaught exception (group=0x4013a760)

如您所见,异常被写入System.err流(这是Android实际上并未使用或支持的Java的stderr)。它没有被任何东西抓住:

  1. 尝试catch语句不起作用,因为这是在一个打开的线程中 尝试预期。
  2. Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler())也不起作用,这似乎非常错误。
  3. 所以我的问题是:

    1. 为什么有些异常的行为与系统级别的其他异常行为不同(又称绕过Thread.setDefault)?
    2. 如果不诉诸System.err或其他“hacky”解决方案,我如何仍能获得这些例外?
    3. 编辑: Android 3.1,Samsung Tab 10.1,但我很确定这不是设备或操作系统相关的问题。

2 个答案:

答案 0 :(得分:2)

  1. 异常来自commons-http - 这是Android刚刚使用的独立apache项目。它使用自己的线程池,因此您的设置对这些线程没有影响。
  2. 如果commons-http吞下它们并登录到system.err,则不能

答案 1 :(得分:0)

为了给你未来的人们这个: 我下面的一些库代码实际上吞噬了异常并写入了system.err。我只是得到了库的源代码,所以我想问这个是我的错,但我认为Konstantin的答案仍然很重要,因为线程池答案。