【问题标题】:Android - print full exception backtrace to logAndroid - 打印完整的异常回溯到日志
【发布时间】:2011-05-19 11:42:39
【问题描述】:

我有一个抛出异常的 try/catch 块,我想在 Android 设备日志中查看有关该异常的信息。

我从我的开发计算机上用这个命令读取了移动设备的日志:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

我首先尝试了这个:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

但这不会在日志中打印任何内容。很遗憾,因为它会有很大帮助。

我取得的最好成绩是:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

总比没有好,但不是很满意。

你知道如何将完整的回溯打印到日志吗?

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    Kotlin 扩展。返回此 throwable 及其堆栈跟踪的详细描述。

    e.stackTraceToString()
    

    【讨论】:

      【解决方案2】:

      科特林解决方案:

      您可以利用属于android.util.Log 类的辅助函数getStackTraceString() 在控制台上打印整个错误消息。

      示例:

      try { 
       
         // your code here
          
      } catch (e: Exception) {
      
           Log.e("TAG", "Exception occurred, stack trace: " + e.getStackTraceString());
      
      }
      

      【讨论】:

        【解决方案3】:
        try {
            // code that might throw an exception
        } catch (Exception e) {
            Log.e("MYAPP", "exception", e);
        }
        

        更多信息更明确

        (因为这是关于这个的最古老的问题。)

        三参数 Android 日志方法将打印作为第三个参数提供的 Exception 的堆栈跟踪。例如

        Log.d(String tag, String msg, Throwable tr)
        

        tr 是例外。

        根据this comment 那些 Log 方法“使用getStackTraceString() 方法......在幕后”来做到这一点。

        【讨论】:

        • 另外,我的风格:Log.e(e.getClass().getName(), e.getMessage(), e);
        • 小心使用 e.getMessage() - getMessage() 可能返回 null,具体取决于已引发的异常类型,这本身会导致异常,因为 null 不支持作为消息参数在日志方法中。见here
        • 此外,在第二个参数中描述什么样的代码导致了这个异常更有意义。无论如何,该消息已经包含在输出中。
        • @Unique 所说的非常重要。最好使用答案中提到的 Log,因为它已经打印了堆栈跟踪
        • @SignoffTeamz 您可以阅读文档。它是一个显示日志的标识符,使您可以更轻松地过滤日志并查看哪个应用程序(以及它的哪一部分)编写了该消息。 developer.android.com/reference/android/util/…, java.lang.String, java.lang.Throwable)
        【解决方案4】:
        try{
                    ...
        } catch (Exception e) {
             Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
        }
        

        【讨论】:

          【解决方案5】:

          在 Android 的上下文中,我必须将异常转换为字符串:

          try {
              url = new URL(REGISTRATION_PATH);
              urlConnection = (HttpURLConnection) url.openConnection();
          } catch(MalformedURLException e) {
              Log.i("MALFORMED URL", String.valueOf(e));
          } catch(IOException e) {
              Log.i("IOException", String.valueOf(e));
          }
          

          【讨论】:

            【解决方案6】:
            public String getStackTrace(Exception e){
              StringWriter sw = new StringWriter();
              PrintWriter pw = new PrintWriter(sw);
              e.printStackTrace(pw);
              return sw.toString();
            }
            

            【讨论】:

              【解决方案7】:

              标准输出和错误输出默认定向到/dev/null,所以全部丢失。如果你想记录这个输出,那么你需要按照here显示的“查看标准输出和标准错误”的说明进行操作。

              【讨论】:

                【解决方案8】:

                这个辅助函数也很好用,因为 Exception 也是一个 Throwable

                    try{
                        //bugtastic code here
                    }
                    catch (Exception e)
                    {
                         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
                    }
                

                【讨论】:

                • 是一个字符串,用于指定应用和位置。任何字符串都可以。
                【解决方案9】:

                e.printStackTrace() 将其打印给我。我认为您没有正确运行 logcat。不要在 shell 中运行它,只需运行

                /home/dan/android-sdk-linux_x86/tools/adb logcat

                【讨论】:

                  【解决方案10】:
                  catch (Exception e) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    PrintStream stream = new PrintStream( baos );
                    e.printStackTrace(stream);
                    stream.flush();
                    Log.e("MYAPP", new String( baos.toByteArray() );
                  }
                  

                  或者……你知道……EboMike 说了什么。

                  【讨论】:

                    猜你喜欢
                    • 2012-05-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-09
                    • 1970-01-01
                    • 2015-07-01
                    相关资源
                    最近更新 更多