당신이 개 코드 샘플 사이에 동작의 차이가 없습니다. (특히, 스택 트레이스는 예외가 생성 될 때 기록되고, 던져 질 때 기록되지 않으므로 다시 던진 예외는 여전히 원래 스택 추적을 갖습니다.) 보통, 따라서 사람들은 더 간단한 관용어를 사용합니다. rethrowing은 그 용도가없는 말은 아니다
.
try {
// bad code
} catch (FooBarException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
}
을하거나 예외를 처리 할 수있는 결정은 단순히 유형을 확인하는 것보다 더 복잡 경우, 당신은 단순히 그것을 잡을하고, 경우 다시 발생 할 수 있습니다 : 예를 들어 당신이 FooBarExceptions를 제외한 모든 예외를 처리하기를 원한다면, 당신은 쓸 수 그것은 당신이 그것을 처리 할 수 없습니다 밝혀 :
for (int attempts = 0; attemps < 6; attempts++) {
try {
return crankyMethod();
} catch (Exception e) {
if (fatal(e)) {
throw e;
} else {
// try again
continue;
}
}
}
그것은 사람들이 다시 throw를 말할 때, 약간의 평균은 다음 예제와 같이 다른 예외를 던질 것을 주목할 필요가있다 :
for (int i = 0; i < array.length; i++) {
try {
process(array[i]);
} catch (Exception e) {
throw new RuntimeException("Could not process element at index " + i, e);
}
}
이 패턴의 장점은 원본 예외를 관련성이있는 추가 정보로 꾸미는 것입니다 (위의 예에서는 처리 할 수없는 데이터). 원래의 예외는 새 스택의 생성자에 전달되므로 스택 추적은 손실되지 않습니다.