2011-11-21 28 views
24

我想打印堆棧跟蹤,因爲此刻我有這個運行。如何打印stacktrace的異常Android

} catch (IOException e) { 
    throw new Error("Copying Failed"); 
} 

而且我已經被告知打印e.stacktrace();

我該怎麼辦呢?

回答

60
} catch (IOException e) { 
    Log.e("YOUR_APP_LOG_TAG", "I got an error", e); 
} 

並檢查輸出logcat的。

+0

這是最好過System.err的? –

+0

@Igor G .:是的,Igor,這比System.err更可取。如果只使用System.err,那麼您將無法在LogCat輸出中看到您的應用程序標籤。 –

+5

我只得到'java.lang.NullPointerException'但這不是一個堆棧跟蹤,那只是錯誤!我怎麼能得到完整的跟蹤? –

10
} catch (IOException e) { 
    e.printStackTrace(); 
} 
1

這是最有可能你被要求通過e.printStackTrace();打印的堆棧跟蹤...

} catch (IOException e) { 
    e.printStackTrace(); 
    throw new Error("Copying Failed"); 
} 
12

在Android中,您應該使用與Android使用的Logcat日誌查看器很好地配合使用的日誌方法。

} catch (IOException e) { 
    Log.e("YOUR ERROR TAG HERE", "Copying failed", e); 
} 

使用Log.e方法,它接受Throwable作爲您確保日誌類將採取堆棧跟蹤和正確登錄它logcat的一個參數。如果使用e.printStackTrace,它將使用常規的Java日誌記錄方法,並且它在Logcat中不會正確顯示,並且在某些情況下,將不可能雙擊logcat中的類名稱以跳轉到上面提到的類和方法堆棧跟蹤。

由零鴻溝打印堆棧跟蹤看起來就像這樣:

11-21 20:55:47.360: W/System.err(989): java.lang.ArithmeticException: divide by zero 
11-21 20:55:47.379: W/System.err(989): at test.tabs.TabChooser.onCreate(TabChooser.java:15) 
11-21 20:55:47.390: W/System.err(989): at android.app.Activity.performCreate(Activity.java:4465) 
11-21 20:55:47.410: W/System.err(989): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-21 20:55:47.410: W/System.err(989): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
11-21 20:55:47.420: W/System.err(989): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-21 20:55:47.420: W/System.err(989): at android.os.Looper.loop(Looper.java:137) 
11-21 20:55:47.420: W/System.err(989): at android.app.ActivityThread.main(ActivityThread.java:4340) 
11-21 20:55:47.430: W/System.err(989): at java.lang.reflect.Method.invokeNative(Native Method) 
11-21 20:55:47.430: W/System.err(989): at java.lang.reflect.Method.invoke(Method.java:511) 
11-21 20:55:47.430: W/System.err(989): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-21 20:55:47.430: W/System.err(989): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-21 20:55:47.430: W/System.err(989): at dalvik.system.NativeStart.main(Native Method) 

異常被記錄爲警告和日誌標籤是不是非常有幫助。

零一分的正確記錄看起來就像這樣:

11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): Copying failed 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): java.lang.ArithmeticException: divide by zero 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at test.tabs.TabChooser.onCreate(TabChooser.java:16) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.Activity.performCreate(Activity.java:4465) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.os.Looper.loop(Looper.java:137) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at android.app.ActivityThread.main(ActivityThread.java:4340) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at java.lang.reflect.Method.invokeNative(Native Method) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at java.lang.reflect.Method.invoke(Method.java:511) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-21 21:03:32.480: E/YOUR ERROR TAG HERE(1356): at dalvik.system.NativeStart.main(Native Method) 

唯一的例外是正確登錄與您的日誌標籤錯誤和日誌信息。

21

的另一種方法,是非常有用的:

try 
{ 
... 
} 
catch (Exception e) 
{ 
    Log.e(APP_TAG, "STACKTRACE"); 
    Log.e(APP_TAG, Log.getStackTraceString(e)); 
} 
+0

你在哪裏設置了「APP_TAG」?或者你沒有? –

+1

@FranciscoCorralesMorales:'APP_TAG'只是一個用常量變量命名項目標籤的常用約定。您可以將其定義爲任何您想要的應用程序標記名稱。 – sligocki