Это плохая идея использовать printStackTrace () для исключений caugt? - PullRequest
55 голосов
/ 04 октября 2010

Является ли плохой идеей использовать printStackTrace () в подобных исключениях для Android?

} catch (Exception e) {
    e.printStackTrace();
}

Ответы [ 5 ]

46 голосов
/ 25 октября 2011

Я считаю, что это то, что вам нужно:

catch (Exception e) {
     Log.e(TAG,Log.getStackTraceString(e)); 
}
37 голосов
/ 04 октября 2010

Да, это плохая идея.Вместо этого вам следует использовать встроенный в Android класс журналов, специально разработанный для этих целей: http://developer.android.com/reference/android/util/Log.html

. Он дает вам возможность регистрировать сообщения об ошибках, предупреждения, ошибки и т. Д.

Регистрация ошибок с помощью:

Log.e(TAG, "message", e), где сообщение может быть объяснением того, что предпринималось при создании исключения

или просто Log.e(TAG, e), если вы не хотите предоставлять какое-либо сообщение для контекста

Затем вы можете щелкнуть консоль журнала внизу во время выполнения кода и легко найти его, используя TAG или тип сообщения журнала в качестве фильтра

19 голосов
/ 05 мая 2016

Да. printStackTrace() удобно, но не рекомендуется, особенно на Android, где он виден через logcat, но регистрируется на неопределенном уровне и без надлежащего сообщения. Вместо этого, правильный способ зарегистрировать исключение ...

Log.e(TAG, "Explanation of what was being attempted", e);

Обратите внимание, что исключение используется в качестве третьего параметра, а не добавляется к параметру сообщения. Log обрабатывает детали для вас - печатает ваше сообщение (которое дает контекст того, что вы пытались сделать в своем коде) и сообщение Exception, а также его трассировку стека.

9 голосов
/ 04 октября 2010

Я бы не использовал printStackTrace(), использовал бы систему регистрации и поддержку исключений.

log.log(Level.SEVERE, "Uncaught exception", e);

Так что, если вы хотите изменить способ ведения журналов, это намного проще.

9 голосов
/ 04 октября 2010

Вопрос: полезна ли вообще печать в стеке трассировки в контексте приложения Andriod? Будет ли стандартный вывод виден во время выполнения? Будет ли кто-нибудь заботиться об этом?

Моя точка зрения заключается в том, что если никто не собирается проверять стандартный вывод и заботиться об отладке ошибки, вызов этого метода является мертвым кодом, а составление сообщения трассировки стека - бесполезный расход. Если вам это нужно только для отладки при разработке, вы можете установить доступную глобальную константу и проверить ее во время выполнения:

} catch (Exception e) {
   if(com.foo.MyEnvironmentConstants.isDebugging()) {
      e.printStackTrace();
   } //else do noting
}
...