Исключения в потоке записываются в System.err вместо того, чтобы их ловили - PullRequest
2 голосов
/ 14 августа 2011

Я уже видел это несколько раз, но не могу найти упоминания об этом.В этом случае я выполняю сетевые операции, и после не разрешения хоста рабочий поток умирает, и 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 (который являетсяStderr Java, который Android фактически не использует или не поддерживает).Ничего не перехватывается:

  1. операторы try catch не работают, так как он находится в потоке, открытом строкой ожидаемой попытки.
  2. Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler()) тоже не работает,что просто кажется очень неправильным.

Итак, мои вопросы:

  1. Почему некоторые исключения ведут себя не так, как другие на уровне системы (иначе ониbypass Thread.setDefault)?
  2. Как мне по-прежнему получать эти исключения, не прибегая к чтению System.err или других «хакерских» решений?

Редактировать: Android 3.1, Samsung Tab 10.1, но я почти уверен, что это не проблема устройства или ОС.

Ответы [ 2 ]

2 голосов
/ 14 августа 2011
  1. Исключение исходит от commons-http - отдельного проекта Apache, только что используемого для Android.Он использует собственные пулы потоков, поэтому ваши настройки не влияют на эти потоки.
  2. Если commons-http проглотит их и войдет в system.err, вы не сможете
0 голосов
/ 18 августа 2011

Просто чтобы иметь это для вас, будущих людей: Какой-то библиотечный код под мной фактически глотал исключения и записывал в system.err. Я только что получил исходный код в библиотеку, так что, думаю, я виноват в том, что спросил об этом, но я думаю, что ответ Константина все еще важен из-за ответа пула потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...