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

Posted

技术标签:

【中文标题】Android - 打印完整的异常回溯到日志【英文标题】:Android - print full exception backtrace to log 【发布时间】:2011-05-19 11:42:39 【问题描述】:

我有一个抛出异常的 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());

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

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

谢谢。

【问题讨论】:

【参考方案1】:

Kotlin 扩展。返回此 throwable 及其堆栈跟踪的详细描述。

e.stackTraceToString()

【讨论】:

【参考方案2】:

科特林解决方案:

您可以利用属于android.util.Log 类的辅助函数getStackTraceString() 在控制台上打印整个错误消息。

示例:

try  
 
   // your code here
    
 catch (e: Exception) 

     Log.e("TAG", "Exception occurred, stack trace: " + e.getStackTraceString());


【讨论】:

【参考方案3】:
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 是例外。

根据this comment 那些 Log 方法“使用getStackTraceString() 方法......在幕后”来做到这一点。

【讨论】:

另外,我的风格:Log.e(e.getClass().getName(), e.getMessage(), e); 小心使用 e.getMessage() - getMessage() 可能返回 null,具体取决于已引发的异常类型,这本身会导致异常,因为 null 不支持作为消息参数在日志方法中。见here 此外,在第二个参数中描述什么样的代码导致了这个异常更有意义。无论如何,该消息已经包含在输出中。 @Unique 所说的非常重要。最好使用答案中提到的 Log,因为它已经打印了堆栈跟踪 @SignoffTeamz 您可以阅读文档。它是一个显示日志的标识符,使您可以更轻松地过滤日志并查看哪个应用程序(以及它的哪一部分)编写了该消息。 developer.android.com/reference/android/util/…, java.lang.String, java.lang.Throwable)【参考方案4】:
try
            ...
 catch (Exception e) 
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());

【讨论】:

【参考方案5】:

在 Android 的上下文中,我必须将异常转换为字符串:

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));

【讨论】:

【参考方案6】:
public String getStackTrace(Exception e)
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();

【讨论】:

【参考方案7】:

标准输出和错误输出默认定向到/dev/null,所以全部丢失。如果你想记录这个输出,那么你需要按照here显示的“查看标准输出和标准错误”的说明进行操作。

【讨论】:

【参考方案8】:

这个辅助函数也很好用,因为 Exception 也是一个 Throwable

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

【讨论】:

是一个字符串,用于指定应用和位置。任何字符串都可以。【参考方案9】:

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

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

【讨论】:

【参考方案10】:
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 说了什么。

【讨论】:

以上是关于Android - 打印完整的异常回溯到日志的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有回溯的情况下退出 Python?

Slf4j打印异常的堆栈信息

如何使用 python 日志框架在带有回溯的警告或信息级别记录异常?

打印异常信息到日志

SpringBoot 配置 AOP 打印日志

在error日志打印异常