하나의 큰 일반 블록에서 여러 예외를 절대로 잡아서는 안된다고 말하는 사람들의 말을 경청하지 마십시오. 어떤 경우에는 일반적인 오류 처리를 수행하는 것이 가장 합리적인 방법이며, 그렇게 할 수있는 능력이 언어에 존재합니다.
몇 가지 예외가있을 수 있습니다 (예 : catch 블록에서 복구). 이러한 예외는 개별적으로 catch하려는 예외의 종류와 가능한 한 일어난다.
그러나 실제 상황에서 직면하게 될 예외의 대부분은 예기치 않은 예외입니다. 이들은 프로그래머 오류 (버그), 실패한 어설 션, 하드웨어 오류, 네트워크 연결 끊김 등의 결과입니다.
최소한의 중단으로 이러한 예측할 수없는 예외를 처리하는 특정 "초 점"을 지정하여 소프트웨어를 방어 적으로 디자인해야합니다 응용 프로그램의 나머지 부분. 대부분의 경우 예외를 "처리하는"것은 현재 작업을 중단하고 오류를 로깅하거나 예기치 않은 오류가 발생했음을 사용자에게 알리는 것을 의미하는 경우가 많습니다.프로그램이 디스크에 파일을 저장하는 경우)
그래서 예를 들어, 당신은 저장 중에 잘못되면 그 일을 잡으려고 시도 블록에 작업을 전체 저장 포장 수 :
try {
// attempt to perform the save operation
doSave();
} catch (Throwable t) {
// tell the user that the save failed for unexpected reasons
// and log the error somewhere
informUser("save failed!");
log("save failed!", t);
} finally {
// last minute cleanup (happens whether save succeeded or failed)
...
}
공지 사항이 우리 여기서 멋진 초크 포인트 메소드를 선택하고 (doSave())이 시점 이상으로 예상치 못한 오류가 발생하지 않도록하십시오. 초크 포인트는 취소 가능한 단일 작업 (저장)을 나타냅니다. 예상치 못한 예외가 발생하는 경우 해당 작업은 분명히 토스트이지만, 나머지 애플리케이션은 초크 포인트의 다른 쪽에서 어떤 일이 발생하든 관계없이 양호한 상태로 유지됩니다.
또한이 관용구가 doSave() 어딘가에서 예외의 일부를 처리하지 못하게한다는 것을 알 수 있습니다. 그래서 던져 질 수있는 예외가 있거나 복구 할 수있는 특별한 방법이 있다면 doSave()에서 그렇게하십시오. 하지만 그 밖의 모든 것에는 당신의 초크 포인트가 있습니다.
당신도 당신의 주요 방법으로 전체 프로그램에 대한 일반적인 캐치되지 않는 예외 핸들러를 설정할 수 있습니다 : 당신이 현명하게 다른 초크 포인트를 설정 한 경우,
public static void main(String [] args) {
try {
startApplication();
} catch (Throwable t) {
informUser("unexpected error! quitting application");
log("fatal application error", t);
}
그러나 예외없는 것까지 어느 거품 여기까지. 일반적인 에러 처리를하고 싶다면, 스윙을 사용하고 있다면 주 스레드 나 AWT 스레드를 포함하여 중요한 스레드에 UncaughtExceptionHandler을 생성하고 할당 할 수 있습니다.
TL; 교리가 가능한 한 구체적으로 예외를 잡아야한다고 생각하지 마십시오. 특정 예외를 잡아서 처리하고 싶을 때나, "잘못 될 수있는 모든 것"을 잡아 내고 처리하기 위해 초크 포인트를 사용하려는 경우가 있습니다.
정확하게. 특정 예외를 포착하는 것은 개발자가 이러한 특정 예외가 발생할 수 있다고 생각한다고 말합니다. 프런트 엔드 응용 프로그램에서 예상치 못한 문제가 발생할 경우를 대비해 사용자에게 친숙한 오류 메시지가 필요한 경우에도 일반 예외로 인해 하루가 절약됩니다. – theraneman