2009-05-05 16 views
1

UserHelperクラスのメソッドimportUsersから(カスタム)ImportExceptionをスローしようとしています。デバッガでは、throw節が実行されていることがわかりますが、importUsersメソッドが呼び出されたメソッドは、例外を捕捉しません。ここでなぜコード実行はcatchブロックに入りませんか(java)?

は、例外がスローされた方法で、次のとおりです。

public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException { 

    //(irrelevant code removed) 

    try { 
     isSuccess = insertUserData(st, blocks, db, actor); 
    } catch (Exception e) { 
     throw new ImportException("Could not insert user on line " + rowCounter); 
    } 
ここ

}

私はAccessorValidatorクラスのexecuteメソッドからスローされた例外をキャッチするために失敗してみてください。

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    //(irrelevant code removed) 
    try{ 
     av = UserHelper.importUsers(data, admin); 
     System.out.print("test2"); 
    } catch (ImportException ie) { 
     System.out.print("testE"); 
     returnMessageValue = ie.getMessage(); 
    } catch (Exception e) { 
     System.out.print("testE2"); 
    } 

出力は "test2"であり、コードの実行はいずれのキャッチブロックにも決して行きません。何が間違っていますか?

+0

UserHelper.importUsers(data、admin); は例外をスローしていません! –

答えて

5

は、あなたが何をデバッグ中に参照すると、実際に(あなたのコンソールをチェックして)実行されている何であることを確認してください、とinsertUserDataが実際に例外をスローするかどうかをできるように

try { 
    isSuccess = insertUserData(st, blocks, db, actor); 
    system.out.print("after insertUserData"); 
} catch (Exception e) { 
    System.out.print("before throwing"); 
    throw new ImportException("Could not insert user on line " + rowCounter); 
} 

にあなたの方法を変更してみてください。

+0

ありがとう、これは私を解決に導いた。 – simon

0

おそらくinsertUserData()はテスト設定に例外をスローしませんか?そのメソッドがあなたの質問にも含まれていれば助けになります...

+0

です。私は "私はデバッガでスロー句が実行されるのを見ることができます"と述べました。具体的には、私はデバッガで、行のコードが であることを確認します。新しいImportException( "行にユーザを挿入できませんでした" + rowCounter); が実行されます。 – simon

+0

実際の例外がいくつかのレベルで深くスローされるため、insertUserDataメソッドからコードを追加しませんでした。 – simon

1

"test2"が出力された場合、importUsers()によってスローされる例外はありません。

デバッガの回線情報が不正確になる可能性があります。 Exceptionのコンストラクタにブレークポイントを設定して、実際に作成されているかどうかを確認してください。

0

insertUserDataが実際に例外をスローし、true/falseブール値を返すだけでなく、デバッガのステップを「スロー」のある行に見ても、何かがスローされたことを意味するわけではありません。

0

順序によって、次のことを確認してください:あなたのブレークポイントは、ソースコード

  • insertUserData()と同期していることを

    1. チェックがすべてで、かどうかを確認し、すべてで例外がスローされていない、それはANを投げるべきです例外かどうか。あなたは決して来ない何かを期待しているように見えます。 ImportExceptionは確かにあなたがそれ
  • 0

    出力はは確かには例外がスローされなかったし、「TEST2」である場合を参照してください。どちらの場合も同じオブジェクトであることをは

  • チェック。ただ、時々、あなたのIDEは、あなたのコードは、外部ライブラリの一部である特別な場合には、実際に実行されているソースコードと同期することはできません...あなたは、ライブラリのコードとドンを変更した場合は...

    を推測

    実際のclasspathを更新しないでください、またはデバッグ中にその変更が発生した場合は、コード行が変更され、実際には発生していない例外がスローされることがあります。解決

    try{ 
         av = UserHelper.importUsers(data, admin); 
         System.out.print("test2"); 
        } catch (ImportException ie) { 
         System.out.print("testE"); 
         returnMessageValue = ie.getMessage(); 
        } catch (Exception e) { 
         System.out.print("testE2"); 
        } catch (Throwable t) { 
         // Here you'll catch *anything* else 
         System.out.print("testTE"); 
        } 
    
  • -1

    はと、Throwableを、例外やエラーのルートをキャッチしてみてください。メソッドimportUsersのtry-catchブロックは、別のtry-catchブロックに囲まれていて、ImportExceptionをスローしていないようです。最初のキャッチブロックが正しく動作していたので、私は2番目のキャッチブロックを見逃しました。

    +0

    一般的には、現在のレベルに関連する例外をキャッチするだけでよいので、長いキャッチ・チェーンに疲れてしまいます。それは、時には、この非常にシナリオが私たちに押し付けられると言われています... – CurtainDog

    関連する問題