从原始的uncaughtException获取StackTrace

时间:2014-02-18 17:16:57

标签: android multithreading exception-handling android-asynctask stack-trace

我正在尝试使用与Logcat相同的AndroidRuntime Exception StackTrace。但是,当我覆盖UncaughtExceptionHandler的uncaughtException时,它给了我一个不同于LogCat的StackTrace。这是我的代码:

private Thread.UncaughtExceptionHandler aovUncaughtExceptionHandler = 
    new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            StackTraceElement stackTrace[] = thread.getStackTrace();
            int stackTraceLength=stackTrace.length;
            String exceptionDescription = "";
            for (int i=0; i<stackTraceLength; i++) {
                exceptionDescription = exceptionDescription + stackTrace[i];
            }
            setException(exceptionDescription,true);
            applicationExceptionHandler.uncaughtException(thread,ex);
        }
    };

public AovGaTracker() {
    applicationExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(aovUncaughtExceptionHandler);
}

使用Exception作为堆栈跟踪源时,这是Stacktrace:

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
android.app.ActivityThread.access$800(ActivityThread.java:139)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:136)
android.app.ActivityThread.main(ActivityThread.java:5102)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
dalvik.system.NativeStart.main(Native Method)

使用Thread作为stackTace源时,这是stackTrace:

dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:579)
com.example.googleanalytics.AovGaTracker$1.uncaughtException(AovGaTracker.java:28)
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
dalvik.system.NativeStart.main(Native Method)

这应该是来自Logcat的StackTrace(这是我需要的):

FATAL EXCEPTION: main
Process: com.example.myfirstapp, PID: 18207
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.MainActivity}:
java.lang.IllegalArgumentException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException
at com.example.myfirstapp.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
... 11 more

stacktrace被执行后,我是否可以执行uncaughtException(Thread thread, Throwable ex)?我需要使用asynctask吗?我需要在同一个线程上编程asynctask吗?

2 个答案:

答案 0 :(得分:1)

根据运行时期间异常集的位置,始终只有一个未捕获的异常。

log cat中的异常是堆栈跟踪和异常原因的组合。您可以组合exception.getStackTrace()和exception.getCause()来获得与logcat相同的结果。

答案 1 :(得分:0)

在一个完美的世界中,DefaultExceptionHandler在整个应用过程中对我来说都很有魅力。如果它导致未处理的异常,它会触发。

名为Android-Remote-StackTrace的图书馆。您只需要在Application类中注册这些DefaultHandlerException类的广播。

段:

 public class Portfolio extends Application {
 static Portfolio portfolio;
 public void onCreate() {
    super.onCreate();
    portfolio = this;
    ExceptionHandler.register(portfolio);// registering for unhandled Exceptions
   }
 }

您可以执行各种任务,例如将日志堆栈跟踪上传到您的服务器,或者使用未处理的堆栈跟踪将应用程序崩溃时的邮件发送为崩溃报告。