IT story

“캐치”없이“시도 적으로”수행하는 것이 합리적입니까?

hot-time 2020. 7. 17. 07:58
반응형

“캐치”없이“시도 적으로”수행하는 것이 합리적입니까?


다음과 같은 코드를 보았습니다.

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

나는 생각 try했다 catch?

이 코드가 왜 이런 식으로 작동합니까?


이것은 현재 실행중인 메소드가 여전히 예외를 처리하고 자원을 적절하게 정리하도록하려는 경우에 유용합니다. 다음은 호출 메소드에서 예외를 처리하는 구체적인 예입니다.

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}

프로그래머는 db.cleanup()try 블록 내부의 코드에서 예외가 발생하더라도 호출 되도록하려고했기 때문 입니다. 예외는 해당 블록에서 처리되지 않지만 finally 블록이 실행 된 후에 만 ​​위쪽으로 전파됩니다.


이 코드가 왜 이런 식으로 작동합니까?

분명히 코드는이 수준에서 예외를 처리하는 방법을 모릅니다. 발신자 중 하나가하는 한, 즉 예외가 궁극적으로 어딘가에서 처리되는 한 괜찮 습니다.

사용자에게 알림을 받거나 예외를 기록하거나 다른 전략을 시도해야하므로 하위 수준 코드는 예외에 적절하게 반응 할 수없는 경우가 많습니다. 낮은 수준의 코드는 하나의 기능 만 수행하며 높은 수준의 의사 결정에 대해서는 알지 못합니다.

그러나 코드는 여전히 리소스를 정리해야합니다 (누설되지 않으면 누출 될 수 있기 때문에). finally절에서 예외가 발생했는지 여부에 관계없이 항상 발생 하는지 확인하십시오 .


finally 블록은 RuntimeException이 발생하더라도 (호출 된 코드의 일부 버그로 인해) db.cleanup()호출이 이루어 지도록합니다.

이것은 또한 너무 많은 중첩을 방지하기 위해 사용됩니다.

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

특히 메소드가 리턴하는 지점이 많은 경우 누구나 정리 코드가 호출되는 것을 볼 수 있으므로 가독성이 향상됩니다.


코드는 데이터베이스가 닫혀 있는지 확인하기 위해 수행하고 있습니다.
일반적으로 모든 데이터베이스 액세스 코드를 try 블록에 넣은 다음 finally 블록에서 데이터베이스를 닫으려면 호출합니다.
try ... finally 작동하는 방식은 try 블록의 코드가 실행되고 finally 블록의 코드가 완료되면 실행됩니다.
컴퓨터가 벽에서 삐걱 거리지 않고 마침내 실행됩니다.
즉, 예외가 호출되고 메소드를 실행하는 데 3 년이 걸리더라도 finally 블록으로 이동하여 데이터베이스가 닫힙니다.


If any of the code in the try block can throw a checked exception, it has to appear in the throws clause of the method signature. If an unchecked exception is thrown, it's bubbled out of the method.

The finally block is always executed, whether an exception is thrown or not.

참고URL : https://stackoverflow.com/questions/2614473/does-it-make-sense-to-do-try-finally-without-catch

반응형