programing

Try / Finally (Catch 없이) 예외를 거품으로 만들 것입니까?

bestprogram 2023. 5. 12. 22:45

Try / Finally (Catch 없이) 예외를 거품으로 만들 것입니까?

저는 답이 YES라고 거의 확신합니다.Try Finally 블록을 사용하지만 Catch 블록을 사용하지 않으면 예외가 거품이 발생합니다.맞습니까?

전반적인 관행에 대해 어떻게 생각하십니까?

세스

네, 꼭 그럴 겁니다.다음과 같이 가정합니다.finally물론 블록은 예외를 두지 않습니다. 이 경우 원래 던졌던 블록을 효과적으로 "교체"할 수 있습니다.

전반적인 관행에 대해 어떻게 생각하십니까?

. 조심하세요.최종적으로 블록이 실행되고 있는 경우 처리되지 않은 예기치 않은 예외가 발생했기 때문에 블록이 실행되고 있을 가능성이 높습니다.이것은 무언가가 고장났다는 것을 의미하며, 전혀 예상치 못한 이 일어날 수 있다는 것을 의미합니다.

그런 상황에서는 마지막 블록에서 코드를 실행해서는 안 된다는 것이 거의 확실합니다.마지막 블록의 코드는 실제로 심각하게 손상될 수 있는 서브시스템이 정상이라고 가정하도록 작성될 수 있습니다.마지막 블록의 코드는 상황을 더 악화시킬 수 있습니다.

예를 들어, 저는 종종 다음과 같은 것을 봅니다.

DisableAccessToTheResource();
try
{
    DoSomethingToTheResource();
}
finally
{
    EnableAccessToTheResource();
}

이 코드의 작성자는 "나는 세계의 상태에 일시적인 돌연변이를 만들고 있다; 나는 내가 불려지기 전의 상태를 복원할 필요가 있다"고 생각하고 있습니다.하지만 이것이 잘못될 수 있는 모든 방법을 생각해 봅시다.

첫째, 호출자가 리소스에 대한 액세스를 이미 비활성화할 수 있습니다. 이 경우 이 코드는 리소스를 다시 활성화합니다. 너무 이른 경우일 수 있습니다.

둘째, DoSomethingToTheResource에서 예외가 발생할 경우 리소스에 대한 액세스를 활성화하는 것이 옳은 일입니까?리소스를 관리하는 코드가 예기치 않게 손상되었습니다.이 코드는 사실상 "관리 코드가 손상된 경우, 다른 코드가 해당 손상된 코드를 가능한 한 빨리 호출할 수 있도록 해야 하며, 로 인해 심각한 오류가 발생할 수 있습니다."라고 말합니다.이것은 나쁜 생각인 것 같습니다.

셋째, DoSomethingToTheResource가 예외를 발생시키는 경우 EnableAccessToTheResource도 예외를 발생시키지 않는다는 것을 어떻게 알 수 있습니까?리소스를 사용하는 것이 어떤 경우에도 정리 코드에 영향을 미칠 수 있으며, 이 경우 원래 예외가 손실되고 문제를 진단하기가 더 어려워집니다.

Try-final 블록을 사용하지 않고 다음과 같은 코드를 작성하는 경향이 있습니다.

bool wasDisabled = IsAccessDisabled();
if (!wasDisabled)
    DisableAccessToTheResource();
DoSomethingToTheResource();
if (!wasDisabled)
    EnableAccessToTheResource();

이제 상태는 필요하지 않는 한 변형되지 않습니다.이제 전화를 건 사람의 상태는 엉망이 아닙니다.이제 DoSomethingToTheResource가 실패하면 액세스를 다시 활성화하지 않습니다.우리는 무언가가 심각하게 고장났다고 가정하고 코드를 계속 실행하려고 노력함으로써 상황을 악화시킬 위험을 감수하지 않습니다.가능하면 전화를 건 사람이 문제를 해결하도록 합니다.

그렇다면 언제 마지막 블록을 실행하는 것이 좋을까요?첫째, 예외가 예상되는 경우입니다.예를 들어 다른 사용자가 파일을 잠갔기 때문에 파일을 잠그는 시도가 실패할 수 있습니다.이 경우 예외를 포착하여 사용자에게 보고하는 것이 좋습니다.그러면 무엇이 부서졌는지에 대한 불확실성이 감소합니다. 청소를 해서 상황을 더 악화시킬 가능성은 거의 없습니다.

둘째, 정리 중인 리소스가 부족한 시스템 리소스인 경우입니다.예를 들어, 파일 핸들을 마지막 블록에서 닫는 것이 의미가 있습니다. (물론 "사용"은 시도 끝 블록을 작성하는 또 다른 방법일 뿐입니다.)파일의 내용이 손상되었을 수 있지만 이제는 어쩔 수 없습니다.파일 핸들이 최종적으로 닫힐 예정이므로, 더 늦기보다는 더 빠를 수 있습니다.

언급URL : https://stackoverflow.com/questions/4305753/will-try-finally-without-the-catch-bubble-the-exception