문제

finally 절 내에서 예외가 발생하는 과정을 감지할 수 있는 방법이 있나요?

아래 예를 참조하세요.


try {
    // code that may or may not throw an exception
} finally {
    SomeCleanupFunctionThatThrows();
    // if currently executing an exception, exit the program,
    // otherwise just let the exception thrown by the function
    // above propagate
}

아니면 예외 중 하나를 무시하는 것이 당신이 할 수 있는 유일한 일입니까?

C++에서는 예외 중 하나를 무시하지 않고 단지 종료()를 호출하는 것도 허용하지 않습니다.대부분의 다른 언어는 java와 동일한 규칙을 사용합니다.

도움이 되었습니까?

해결책

다음과 같이 플래그 변수를 설정한 다음 finally 절에서 이를 확인하세요.

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}

다른 팁

이 작업을 수행하는 경우 디자인에 문제가 있을 수 있습니다."finally" 블록의 개념은 메서드가 어떻게 종료되는지에 관계없이 작업이 완료되기를 원한다는 것입니다.내가 보기에는 finally 블록이 전혀 필요하지 않고 try-catch 블록만 사용해야 하는 것 같습니다.

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}

함수가 발생하고 예외를 포착하려면 함수를 try 블록에 래핑해야 합니다. 이것이 가장 안전한 방법입니다.따라서 귀하의 예에서는 다음과 같습니다.

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}

try 블록이 성공적으로 완료되었는지 여부에 따라 finally 블록이 다르게 작동하도록 하시겠습니까?

그렇다면 언제든지 다음과 같이 할 수 있습니다.

boolean exceptionThrown = false;
try {
    // ...
} catch(Throwable t) {
    exceptionThrown = true;
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { 
        if(exceptionThrown) ...
    }
}

꽤 복잡해지긴 하지만...이 작업을 불필요하게 만들기 위해 코드를 재구성하는 방법을 생각하고 싶을 수도 있습니다.

아니요, 저는 그렇게 믿지 않습니다.catch 블록은 finally 블록 이전에 완료될 때까지 실행됩니다.

try {
    // code that may or may not throw an exception
} catch {
// catch block must exist.
finally {
    SomeCleanupFunctionThatThrows();
// this portion is ran after catch block finishes
}

그렇지 않으면 예외 코드가 사용할 sync() 개체를 추가할 수 있으며 finally 블록에서 확인할 수 있습니다. 이는 별도의 스레드에서 예외가 실행되고 있는지 식별하는 데 도움이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top