답변:
이는 현재 실행중인 메서드가 리소스를 적절하게 정리할 수 있도록 허용하면서 여전히 예외를 throw하도록하려는 경우 유용합니다. 다음은 호출 메서드에서 예외를 처리하는 구체적인 예입니다.
public void yourOtherMethod() {
try {
yourMethod();
} catch (YourException ex) {
// handle exception
}
}
public void yourMethod() throws YourException {
try {
db.store(mydata);
} finally {
db.cleanup();
}
}
catch
블록이 없으면 던져진 예외 가 블록의 예외 finally
보다 먼저 실행됩니다 try
. 따라서 두 개의 예외가 하나에 try
있고 하나가 발생 finally
하는 유일한 예외는 finally
. 이 동작은 PHP와 Python에서 동일하지 않습니다. 두 예외가이 언어에서 동시에 발생하고 예외 순서가 try
first an then finally
입니다.
프로그래머가 db.cleanup()
try 블록 내부의 코드에서 예외가 발생하더라도 호출 되는지 확인하기를 원했기 때문 입니다. 모든 예외는 해당 블록에 의해 처리되지 않지만 finally 블록이 실행 된 후에 만 위쪽으로 전파됩니다.
try
수 있도록 단지가있다 finally
. 예외는 포착되지 않습니다.
이 코드가 이런 식으로하는 이유는 무엇입니까?
분명히 코드는이 수준에서 예외를 처리하는 방법을 모르기 때문입니다. 괜찮 습니다. 호출자 중 한 명이하는 한, 즉 예외가 궁극적으로 어딘가에서 처리되는 한.
종종 사용자에게 알림을 보내야하거나 예외를 기록해야하거나 다른 전략을 시도해야하기 때문에 하위 수준 코드가 예외에 적절하게 반응 할 수 없습니다. 낮은 수준의 코드는 하나의 기능 만 수행 하고 높은 수준의 의사 결정에 대해 알지 못합니다.
그러나 코드는 여전히 리소스를 정리해야합니다 (그렇지 않으면 누출 될 수 있기 때문입니다). 따라서 예외가 발생했는지 여부에 관계없이 항상 발생 하도록 finally
절 에서이를 수행 합니다.
try 블록의 코드 중 하나라도 확인 된 예외를 throw 할 수있는 경우 메서드 서명의 throws 절에 나타나야합니다. 확인되지 않은 예외가 발생하면 메서드에서 버블 링됩니다.
finally 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.
fopen
또는 DB 연결 (PHP에서도 사용)에 대해 언급 된 다른 응답과 같이 정리를 보장합니다.