我在 Eclipse 中的 logcat 窗口只为每个异常显示 StackTrace 的前几行。这意味着我经常看不到异常发生在哪里。有没有办法改变这个设置?
3 回答
如果您指的是“...12 more lines...”部分,您只会看到导致另一个异常的异常。如果堆栈跟踪的顶部与之前的跟踪相同,则仅针对最外面的异常显示完整的帧集,其他跟踪得到“...”处理。
换句话说,未显示的跟踪块是异常原因链中较早出现的跟踪的副本。例如,假设我有方法main()
调用的代码,one()
调用的地方two()
等等。 four()
抛出异常。 two()
抓住它并重新抛出它。异常将如下所示:
java.lang.RuntimeException: re-throw
at Foo.two(Foo.java:14)
at Foo.one(Foo.java:7)
at Foo.main(Foo.java:3)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: first
at Foo.four(Foo.java:23)
at Foo.three(Foo.java:19)
at Foo.two(Foo.java:12)
... 3 more
“由”异常表示“... 3 more”,而不是明确列出one()
,main()
和dalvik.system.NativeStart.main
. 因此,要获得初始异常的完整跟踪,您可以从读取它的跟踪开始,然后继续上面的跟踪。
注意没有重叠——two()
出现在两者中,但在“第一个”跟踪中它在对 的调用中three()
,而在“重新抛出”跟踪中它在throw
指令上。
您可以使用参数重载所有日志方法(log.d、log.i、log.e 等)(String tag, String msg, Throwable tr)
,其中第三个参数是异常。这将为您提供 logcat 中的完整堆栈跟踪
http://developer.android.com/reference/android/util/Log.html
如果您的代码调用的方法产生的堆栈太高,您可以(并且应该)处理代码中的异常并输出与日志相关的任何内容。
如果您没有任何异常处理,并且您甚至不知道应该在代码中的哪个位置放置这样的处理程序,那么问题完全出在其他地方 - 您应该比这更好地处理异常。