e.printStackTrace(); in string

55

e.printStackTrace()方法可以打印异常错误,因此我想将整个异常信息存入String并使用Toast.makeText()显示。
我该怎么做?
如果还有其他备选方案,请与我分享或建议我。


你的赏金目标是什么?你需要比已接受答案中提供的更多信息吗?你希望得到替代性的回答(方向是什么)?你只是想为现有答案提供额外的奖励吗?关于这个问题的一些评论将会很有帮助,这样潜在的回答者就会知道你在回答中想要什么。 - Paŭlo Ebermann
我需要更多关于它的信息。 - Nikunj Patel
5个回答

116

使用以下的代码片段:

Writer writer = new StringWriter();
exception.printStackTrace(new PrintWriter(writer));
String s = writer.toString();
自从Android 4.0(API 14)开始,使用Log.getStackTraceString调用一行代码将异常堆栈跟踪提取为字符串不再可靠。原因是该方法对于UnknownHostException返回空字符串(有关详细信息,请参见Android问题#21436,简而言之:“为了减少网络不可用的非错误条件下应用程序产生的日志输出量”,Android工程师做出了一个我认为是可疑的决定来修改Log.getStackTraceString方法)。因此最好使用我在本文开头提供的代码。

实际上,我已经开发了一个应用程序,其中有很多SWF文件留在应用程序中。这些SWF文件在模拟器中无法播放,因此每次都必须在设备上进行测试。但是设备有限制,不能显示错误。所以我找到了这个解决方案。 - Nikunj Patel
1
很棒的解决方案,因为其他方法并不总是指向错误的确切行! - Vicky Kapadia
//这是为了减少应用程序在网络不可用的非错误条件下产生大量日志输出。 //这就是为什么移除了UnknownHostException的原因。 - Dheeraj Bhaskar

66
import android.util.Log;

...

String stackTrace = Log.getStackTraceString(e);

7
谢谢。看起来它没有得到应有的关注 :) - TotoroTotoro
这是这个问题的最佳答案。其他的都太繁琐了。 - Vicky Kapadia
@Macondo2Seattle 你救了我的一天和时间,谢谢...+1票 - Sagar Aghara

6

这是可行的,但不建议这样做。只显示错误信息(即使对于“真正”的用户来说,这也太多了),完整的堆栈跟踪应仅记录在日志中。


2
错误信息并不等同于完整的堆栈跟踪。将堆栈跟踪显示为 Toast 通知会导致其大部分内容无法阅读。此外,由于堆栈跟踪通常很长,Toast 通知也会在几秒钟后消失,您将没有足够的时间来阅读它。 - Nikolay Elenkov

0

你可以将堆栈跟踪打印到流中并从中读取。

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintWriter pw = new PrintWriter(baos);

e.printStackTrace(pw);
String stachTrace = new String(baos.toByteArray());

或者您可以使用StringWriter代替ByteArrayOutputStream。


这就是我如何将堆栈跟踪写入文本文件或控制台,以便以后查看。 - Doug Hauf
你也可以考虑使用日志框架(这是更好的选择),例如log4j、slf4j等。 - Anantha Sharma

0

在你的异常处理程序中使用:

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);

e.printStackTrace(pw);

whateverFunctionYouLikeToPrintYourStackTrace(sw.getBuffer().toString());

然而,使用ADB和logcat会更好,因为Toast上的堆栈跟踪看起来很糟糕。


Toast是什么?我只想将我的堆栈跟踪打印到文本文件中。 - Doug Hauf
Toast是屏幕下中部的烦人灰色框,是系统范围内一些相当重要的Android软件误用的。它们只适用于调试,但即使这样也不再好用了。使用logcat,这是首选方法。 - Chiguireitor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接