Android-完全な例外バックトレースをログに出力します


94

例外をスローする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());
}

何もないよりはましだが、あまり満足できない。

完全なバックトレースをログに出力する方法を知っていますか?

ありがとう。

回答:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

さらなる情報でより明確に

(これはこれに関する最も古い質問なので)

3つの引数を持つAndroidログメソッドはException、3番目のパラメーターとして提供されるのスタックトレースを出力します。例えば

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

tr例外はどこですか。

このコメントによるとこれらのLogメソッドは「方法を使用してgetStackTraceString()...裏で」それを実行します。


4
さらに、私のスタイル:Log.e(e.getClass()。getName()、e.getMessage()、e);
Vikas '20年

27
e.getMessage()の使用に注意してください-スローされた例外のタイプによっては、getMessage()がnullを返す場合があります。これは、Logメソッドのメッセージパラメータとしてnullがサポートされていないため、それ自体が例外を引き起こします。こちらをご覧ください
Uniqe

さらに、2番目のパラメーターでこの例外の原因となったコードの種類を説明する方が理にかなっています。いずれにしても、メッセージはすでに出力に含まれています。
EboMike 2014年

1
@Uniqueが言うことは非常に重要です。スタックトレースが既に出力されているため、回答で述べたようにLogを使用することをお勧めします
Buddy

1
@SignoffTeamzちょうどドキュメントを読むことができます。これはログを表示する識別子であり、ログをフィルタリングして、メッセージを書き込んだアプリ(およびその一部)を簡単に確認できます。developer.android.com/reference/android/util/...、java.lang.Stringで、java.lang.Throwableの)
EboMike

52

ExceptionThrowableでもあるので、このヘルパー関数もうまく機能します。

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

これは、アプリと場所を指定するために使用される文字列です。任意の文字列がそこで行われます。
ジョージ

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

または...ええと...エボマイクが言ったこと。


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

2

e.printStackTrace()はそれを出力します。logcatを正しく実行しているとは思いません。シェルで実行せず、ただ実行する

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


1

標準出力とエラー出力はデフォルトで/ dev / nullに送信されるため、すべて失われます。この出力をログに記録する場合は、ここに示す「stdoutおよびstderrの表示」の指示に従う必要があります。



0

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));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.