【问题标题】:How to print stacktrace for an exception Android [duplicate]如何打印异常Android的堆栈跟踪[重复]
【发布时间】:2012-01-03 06:54:18
【问题描述】:

我想打印堆栈跟踪,因为目前我正在运行它。

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

我被告知打印e.stacktrace();

我该怎么做?

【问题讨论】:

    标签: android android-logcat


    【解决方案1】:
    } catch (IOException e) {
        Log.e("YOUR_APP_LOG_TAG", "I got an error", e);
    }
    

    然后检查 LogCat 的输出。

    【讨论】:

    • 这比 System.err 更可取吗?
    • @Igor G.:是的,Igor,这比 System.err 更可取。如果您只使用 System.err,那么您将无法在 LogCat 输出中看到您的应用程序标签。
    • 我只得到java.lang.NullPointerException,但这不是堆栈跟踪,这只是错误!,我怎样才能得到完整的跟踪?
    • @FranciscoCorralesMorales:您是否将三个参数传递给 Log.e?如果您只传递两个参数,例如Log.e("tag", e);Log.e("tag", "message" + e); 那么你将不会得到跟踪。必须是Log.e("tag", "message", e);
    • 不知何故从来不知道这种对 Log 方法的覆盖存在。呜呜呜!
    【解决方案2】:

    另一种方法,非常有用:

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

    【讨论】:

    • 你在哪里设置 APP_TAG ?或者你没有?
    • @FranciscoCorralesMorales:APP_TAG 只是用常量变量命名项目标签的常用约定。您可以将其定义为您希望应用程序标记名称的任何名称。
    【解决方案3】:

    在 Android 中,您应该使用与 Android 使用的 Logcat 日志查看器完美配合的日志方法。

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

    使用将 throwable 作为参数的 Log.e 方法,您可以确保日志类将获取堆栈跟踪并将其正确记录到 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)
    

    异常被正确地记录为您的日志标签和日志消息的错误。

    【讨论】:

      【解决方案4】:
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      【讨论】:

        【解决方案5】:

        很可能您被要求通过e.printStackTrace();...打印堆栈跟踪...

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2011-01-18
          • 1970-01-01
          • 2014-08-06
          • 1970-01-01
          • 2010-09-25
          • 2011-05-15
          相关资源
          最近更新 更多