2011-06-28 10 views
3

ログアプリケーションにexception.getMessage()を追加しましたが、exception.getMessage()Nullと表示されますが、デバッグ時に例外オブジェクトの詳細メッセージに例外文字列が表示される場合があります詳細なメッセージが表示されますか?注 - getMessageNullを返します。Java例外オブジェクトの詳細メッセージにアクセスする

P.S - 私はPrintStackTraceまたはstacktraceElementを使用していません。私のロガーはexception.getmessage()から文字列を返す必要があります。コメントから


DBException dbExe = new DBException(sqlExe); 
DBException objDbEx = (DBException) ExceptionUtil.populateSuperException(dbExe, strTraceMesg, ConstantsIF.SEVERE_LEVEL, false, null, null, null); 
throw objDbEx; 

public static SuperException populateSuperException (SuperException exSuperException, String strTraceMsg, char chTraceLevel,) { 
    if (strTraceMsg != null) { 
    switch (chTraceLevel) { 
     case Con.IN: 
     case Con.S: 
     //log 
    } 
    } 
    return exSuperException; 
} 
あなたは完全なスタックトレースをプリントアウトすることができ
+1

いくつかのコードを表示します(例外チェーンの周り)。例外をラップする場合、ラップされた例外がメッセージを保持していない場合は、nullが返されます。 – rajasaur

+0

はい、私は例外をラップしますが、私は同じオブジェクトを返します。以下のコードをご覧ください。 –

+0

'exception.getCause()。getMessage()'はあなたの情報を保持していますか? – oliholz

答えて

4

exception.printStackTrace(); 
+0

私はPrintStackTraceまたはstacktraceElementを使用していないので、私のロガーはexception.getmessage()から文字列を返す必要があります。 –

+0

誰が必要ですか? – Giann

+0

これは、既存のコードがどのように流れるかを意味しているので、ex.getMessageからのメッセージが必要です。 –

0

試してみてください。

  switch (chTraceLevel) { 
       case Con.IN: 
       case Con.S: 
        String msg = exSuperException.getCause().getMessage(); 
        // LOG msg 
      } 
+1

yes Exception.getCause()。getMessage();これはメッセージを持っていますが、なぜException.getMessage()に入らないのですか? –

+0

@SrideviLaks、あなたは答えをここに見つけるでしょう:https://stackoverflow.com/a/9017846/7022062基本的に例外はラップすることができます(そして複数回)。提供されたリンクを使用すると、問題の根本的な原因を解消することができます。 –

0

これはかなり変です。デバッグで表示されるメッセージは通常Throwable#toStringによって作成され、内部ではgetLocalizedMessage()が呼び出されます。

のでかの例外は、メッセージ、を持っている、それがgetMessage()を通じて返されるべきtoString()結果の一部です。

例外/スローブには詳細なメッセージは必要ありません。メッセージで例外を作成した場合は、再度確認してください。読みやすいコードを行った後


:あなたのメッセージなし作成されるので、dbExe.getMessage()nullを返します。作成中のいずれか原因を見たり、メッセージを追加します。

DBException dbExe = new DBException(sqlExe.toString(), sqlExe);// just an example 
+0

いいえ、返されています、私のException .getMessageが提供しているもの。 –

+0

@Sridevi Laks - あなたが 'dbExe.getMessage()'が与えているものを返して、*例外がメッセージを運びません。私の編集とoliholzの提案を見てください –

+0

ありがとう、それは働いています。私はDBExceptionとしてコンストラクタを呼び出さなければならないdbExe = new DBException(sqlExe。getMessage()、sqlExe); DBExceptionの代わりにdbExe =新しいDBException(sqlExe); –

0

をあなたは(あなたが唯一のチェーンされた例外を指定している)任意のメッセージを表示せずに、あなたの例外オブジェクトを作成していますので、

DBException dbExe = new DBException(sqlExe); 

呼び出しますdbExe.getMessage()は(正確に)nullを返す可能性があります(詳細については、この状況でコンストラクタが何をするかによって異なります)。スタックトレースのメッセージが偶然に見える理由は、stacktraceの生成が根本的な例外に反復し、sqlExe.getMessage()が表示されるためです。

解決策は、単に例外を構築する際にメッセージと基本的な例外を提供することです。一般的な知恵はので、おそらく、これは例外がスローされるレベルを反映すべきであることを、次のようなものです:

DBException dbExe = new DBException("Unable to persist widgets", sqlExe); 

ご指定されていない「既存のコードの流れについての要件は、」あなたは、実際のデータベース例外が必要であることを意味している場合メッセージの重複は非常に素晴らしいではありません全体的に

DBException dbExe = new DBException(sqlExe.getMessage(), sqlExe); 

かかわらを、そしてかつてのオプションは、より多くの「正しい」ものです:dbExeでのメッセージであることを、あなたは次のようにこれを構築することができます。

+1

これは間違っています。コンストラクタThrowable(Throwable cause)は、メッセージをcause.toString()で更新します。 cause.toStringは少なくともthrowableクラスの名前を返します。この場合、DBException(Exception ex)がsuper(ex)を呼び出すと想定していますが、これは当てはまりません。したがって、私の要求もそのコードを参照してください。 – maasg

+0

@maasg非常に良い点は、私はそれについては明示的に考えていませんでしたが、その単一の引数で 'DBException'コンストラクタが何をするかに完全に依存しています。実際には、私が扱ってきた文化が常に例外を行ってきた方法であるという理由だけで、「super(ex)」と呼んでいないと仮定していました(つまり、メッセージを指定しなければ、おそらくあなたはスーパークラスの振る舞いよりもヌルであるほうが良いですが、これは別の引数です)。 –

+0

@ Andrzej Doyle - 洞察力のために感謝のために投票を使用しました。 @ maasg - はいでも私は同じことを念頭に置いています。この場合、getMessageはクラス名を持つ必要がありますが、私にとってはnull、DBExceptionのconstrcutorを与えていますpublic DBException(Throwable throwable){ super(throwable); } –

0

コメントの議論から、あなたの問題の根本的な原因は、コンストラクタまたはその階層の実装にあるという結論です。正当な理由で、例外クラス階層(例:super(reason);)が呼び出されていないと考えられ、dbException.getMessage()の呼び出しから期待される動作が得られません。 (唯一の関連ビットが示す)

public Throwable(Throwable cause) { 
    ... 
    detailMessage = (cause==null ? null : cause.toString()); 
    ... 
} 
public String toString() { 
    ... 
    String message = getLocalizedMessage(); 
    ... 
} 

public String getLocalizedMessage() { 
    return getMessage(); 
} 

問題の根本的な原因としての実装を確認してください:new Exception(anotherException)への呼び出しは、常にこのコールチェーンを介してベースThrowableクラスにgetMessage()コールをバックアップフィールドに移入することに注意してください議論された。

関連する問題