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
'programing' 카테고리의 다른 글
React Native의 iOS 실행 화면 (0) | 2023.05.12 |
---|---|
Swift에서 인덱스로 매핑 또는 축소 (0) | 2023.05.12 |
'사용자 "postgres"에 대한 암호 인증에 실패 (0) | 2023.05.07 |
SET READ_ 기간COMMITED_SNAPHOT 테이크? (0) | 2023.05.07 |
Kestrel이란 무엇입니까(vs IIS / Express) (0) | 2023.05.07 |