4

オブジェクトのコレクションに対していくつかのステップを実行する別のクラスによって呼び出されているメソッドがあります。具体的には、ファイルのリストを元の場所から新しいフォルダーにコピーしています。ファイルがコピーされた後、ファイルのグループに関連する追加データでデータベースを更新します。これは次のようになります。

public void copyFilesAndStore(File[] files, DataObject additionalData){
    for (File f in files){
        copyFileToDestination(f);
    }
    updateDatabase(additionalData);
}

問題は、ファイルの1つに問題がある場合、copyFileToDestination(File f)メソッドがさまざまなIOExceptionをスローする可能性があることですが、ファイルの1つに例外がある場合でも、残りのファイルをコピーし続けたいと思います。ファイルを作成し、データベースを更新するための呼び出しを行います。だから私はこのようなことをすることができます:

public void copyFilesAndStore(File[] files, DataObject additionalData){
    for (File f in files){
        try {
            copyFileToDestination(f);
        } catch (IOException ex) {
            log(ex);
        }
    }
    updateDatabase(additionalData);
}

ただし、copyFilesAndStore()を呼び出すクラスは、コピーが成功したかどうかを知る必要がありますが、このメソッド内のすべての例外をキャッチすると、それらについてはわかりません。以下のようなことをするのはまったく意味がありますか、それとも私はより良い解決策を逃していますか?

public void copyFilesAndStore(File[] files, DataObject additionalData){

    IOException encounteredException = null;

    for (File f in files){
        try {
            copyFileToDestination(f);
        } catch (IOException ex) {
            log(ex);
            encounteredException = ex;
        }
    }

    updateDatabase(additionalData);

    if (encounteredException != null)
        throw(encounteredException);
}
4

4 に答える 4

3

例外を格納することは完全に安全ですが (OutOfMemoryException などのいくつかのまれなケースを除く)、可能性のある例外をループに格納する場合は、通常、それらをすべて格納することをお勧めします。

public void copyFilesAndStore(File[] files, DataObject additionalData){ 

    List<IOException> encounteredExceptions = new LinkedList<IOException>(); 

    for (File f in files){ 
        try { 
            copyFileToDestination(f); 
        } catch (IOException ex) { 
            log(ex); 
            encounteredExceptions.add(ex); 
        } 
    } 

    updateDatabase(additionalData); 

    if (!encounteredExceptions.empty()) {
        throw(new DelayedException(encounteredExceptions)); 
    }
} 

whereDelayedExceptionは、他の例外のリストを格納できる独自のカスタム例外です (通常の例外の原因連鎖のようなものです)。

于 2012-04-12T01:22:49.097 に答える
1

encounteredException原因としてリストする独自の例外をスローする方が適切だと思います。

throw new CopyAndStoreFailedException(encounteredException);

例外の種類で複数の例外を追跡できるようにすることも理にかなっている場合がありますcause。ユーザーに問題を示したり、回復を試みたりできるように、消費するコードがコピーに失敗した特定のファイルを知りたい場合があります。何らかの方法で問題から。したがって、カスタム例外に のリスト全体を渡します。このリストはencounteredExceptions、getter メソッドを介して取得できます。

于 2012-04-12T01:19:13.337 に答える
0

確かに、後でそれらを再スローしないでください-とにかく、最初のものだけが行きます。個人的には、問題のあるファイル名 (およびおそらくわかりやすい特定のエラー文字列) をリストに保存し、後で表示するだけです。例えば。「ファイル abc.txt が失敗しました: 見つかりません」

于 2012-04-12T01:17:12.743 に答える
-1

それは問題ありませんが、最後にキャッチされた例外のみをスローしています。エラーが発生したすべてのファイルを保存してから、リストを返したい場合があります。

public void copyFilesAndStore(File[] files, DataObject additionalData){

    YourExceptionClass encounteredException = new YourExceptionClass();

    for (File f in files){
        try {
            copyFileToDestination(f);
        } catch (IOException ex) {
            log(ex);
            encounteredException.addFile(f);
        }
    }

    updateDatabase(additionalData);

    if (encounteredException.hasFiles)
        throw(encounteredException);
}
于 2012-04-12T01:22:02.883 に答える