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 - 打印完整的异常回溯到日志的主要内容,如果未能解决你的问题,请参考以下文章