2012-04-12 2 views
4

개체 모음에서 여러 단계를 수행하는 다른 클래스에서 호출하는 메서드가 있습니다. 특히 원본 위치에서 새 폴더로 파일 목록을 복사하고 있습니다. 파일을 복사 한 후에는 파일 그룹과 관련된 추가 데이터로 데이터베이스를 업데이트합니다. 파일 중 하나에 문제가있을 경우 copyFileToDestination (파일 C) 방법은 다양한하는 IOException을 던질 수 있지만, 하나의 예외가있는 경우에도,나중에 예외를 변수에 저장하여 나중에 처리 할 수 ​​있습니까?

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

문제가 있습니다 : 그것은 다음과 같이 보입니다 파일을 복사하고 파일의 나머지 부분을 계속 복사하고 데이터베이스를 업데이트하기 위해 호출하고 싶습니다. 그래서 나는 같은 것을 수행 할 수 있습니다

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); 
} 
+3

, 당신은 모든 컬렉션을 저장해야합니다. 마지막 하나. – bdares

답변

3

이 (에서 OutOfMemoryException 등 같은 일부 코너의 경우를 제외) 예외를 저장하기 위해 완벽하게 안전하지만 루프에서 가능한 예외를 저장하려면, 그것은 그들 모두를 저장하는 것이 좋습니다 일반적으로 : DelayedException 다른 예외 목록을 저장할 수있는 사용자 정의 예외

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)); 
    } 
} 

(가지처럼을 발생-에 의해 일정한 예외 체인) 당신은 예외 객체를 저장하는 경우 내 생각

0

나중에 다시 던지지 마십시오. 확실히 첫 번째 것만 이동합니다. 나는 개인적으로 기분을 상하게하는 파일 이름 (아마도 우호적 인 특정 오류 문자열)을 목록에 저장하고 나중에 표시 할 것입니다. 예 : "파일 abc.txt 실패 : Not found"가 : 그것은 심지어 예외 유형을 가지고 적합 할 수 있습니다

throw new CopyAndStoreFailedException(encounteredException); 

1

가 나는 원인으로 encounteredException 목록, 당신의 자신의 예외를 던질 더 적합 할 것이라고 생각 여러 개의 cause 예외를 추적 할 수 있어야합니다. 소비 코드가 어떤 특정 파일을 복사하지 못했는지 파악하여 문제를 사용자에게 표시하거나 문제를 특정 방식으로 복구하려고 할 수 있습니다. 따라서 getter 메서드를 통해 검색 할 수있는 사용자 지정 예외 전체 목록을 encounteredExceptions으로 전달합니다.

-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); 
} 
+0

그래, 나는 마지막 것만 던져 질 것이라는 것을 깨달았다; 나는 요구 사항이 호출 클래스 (다른 개인에 의해 개발 됨)에 대해 무엇인지, 그리고 실제로 어떤 특별한 예외가 발생했는지에 대해 실제로 관심이 있는지 또는 최소한 하나의 예외가 발생했는지에 관해 알아봐야 할 것이다. 감사! – Sammy1Am

관련 문제