Android-打印完整的异常回溯记录到日志


94

我有一个try / catch块引发异常,我想在Android设备日志中查看有关异常的信息。

我从开发计算机上使用以下命令读取了移动设备的日志:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

我首先尝试了这个:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

但这不会在日志中显示任何内容。很可惜,因为这样做会有所帮助。

我取得的最好成绩是:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

总比没有好,但不是很令人满意。

您知道如何将完整的回溯记录打印到日志吗?

谢谢。

Answers:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

更详细地了解更多信息

(因为这是最古老的问题。)

包含三个参数的Android日志方法将打印Exception作为第三个参数提供的的堆栈跟踪。例如

Log.d(String tag, String msg, Throwable tr)

tr例外在哪里。

根据此评论,那些Log方法“ getStackTraceString()在幕后使用...”。


4
另外,我的样式:Log.e(e.getClass()。getName(),e.​​getMessage(),e);
维卡斯

27
当心使用e.getMessage()-getMessage()可能会返回null,具体取决于抛出的异常类型,这本身会导致异常,因为Log方法中不支持null作为消息参数。看到这里
Uniqe 2011年

此外,在第二个参数中描述导致此异常的代码类型更有意义。无论如何,该消息已经包含在输出中。
EboMike 2014年

1
@Unique所说的很重要。最好使用答案中提到的Log,因为它已经打印了堆栈跟踪
Buddy

1
@SignoffTeamz您可以阅读文档。这是一个显示日志的标识符,使您可以更轻松地过滤日志并查看哪个应用程序(及其部分)写了消息。developer.android.com/reference/android/util/...,java.lang.String中,java.lang.Throwable的)
EboMike

52

由于Exception也是Throwable,因此此辅助函数也很好用。

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

它是用于指定应用程序和位置的字符串。任何字符串都可以。
乔治

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

或者...你知道... EboMike说了什么。



2

e.printStackTrace()将其打印给我。我认为您没有正确运行logcat。不要在外壳中运行,只需运行

/home/dan/android-sdk-linux_x86/tools/adb logcat


1

默认情况下,标准输出和错误输出定向到/ dev / null,因此全部丢失。如果要记录此输出,则需要遵循此处显示的说明“查看stdout和stderr”


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

0

在Android的上下文中,我必须将Exception强制转换为String:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.