programing

블록과 시도/잡기 블록을 제외한 __try/__를 사용하는 것이 더 나을까요?

iphone6s 2023. 9. 24. 12:33
반응형

블록과 시도/잡기 블록을 제외한 __try/__를 사용하는 것이 더 나을까요?

내가 던지는 예외를 잡는 더 좋은 방법이 무엇인지 궁금합니다. 블록과 시도/포획 블록을 제외한 __시도 / __인가요?

저는 C++로 글을 쓰고 있는데 프로그램은 윈도우에서만 사용하기 때문에 휴대성은 문제가 되지 않습니다.

감사합니다!

이 두 가지는 아주 다른 것입니다. try/catch는 여러분이 알고 있는 친숙한 C++ 키워드입니다.__try/__exceptSEH 예외를 잡는 데 사용됩니다.DivisionByZero 또는 AccessViolation과 같은 Windows 자체에서 제기되는 예외 사항입니다.그것에 대한 MSDN 라이브러리 기사에 잘 설명되어 있습니다.

윈도우 SEH 기능을 활용하기 때문에 C++ 예외를 잡는 데도 사용할 수 있습니다.그러나 던져진 예외 개체를 제거할 수 없으므로 실제로 예외 처리를 원할 경우 컨텍스트가 0이 됩니다.그건 미친 짓입니다.가장 중요한 접근법은 SEH 예외를 절대로 포착하지 않는 것입니다. 항상 역겹기 때문입니다.둘을 결합해야 하는 경우 _set_se_translator()를 사용하여 SEH 예외를 C++ 예외로 변환합니다.

당신은 a를 사용해야 합니다.try/catch막다른 골목

다른 사람들이 이미 대답했듯이,__try/__except는 SEH(window generated errors)를 잡기 위한 것이지 일반적인 예외를 잡기 위한 것은 아닙니다.

가장 중요한 건__try그리고.__catch예외가 던져질 때 C++ destructor를 실행하거나 스택을 올바르게 풀 수 없습니다.

드문 경우를 제외하고는 절대 SEH 예외를 잡으려고 해서는 안 됩니다.

편집: 글쎄요, 저는 이것에 대해 긍정적으로 생각했지만(항상 그렇게 말해왔습니다), @Hans는 이것을 바꾸기 위해 사용할 수 있는 컴파일러 스위치가 있다고 말합니다.내 생각엔 그 문서들은/EHa오해의 소지가 있거나 최소한 불완전한 부분이 있습니다만약 누군가가 이것이 틀렸다는 것을 증명하는 확실한 문서를 찾는다면, 나는 기꺼이 이 답변을 삭제할 것입니다.

만약 이것이 거짓으로 밝혀지더라도, 당신은 여전히try그리고.catch단순히 그들이 표준이기 때문에, 반면에.__try그리고.__except아닙니다.

__try/__except는 예외를 지원하지 않지만 구조화된 오류 코드/처리 메커니즘을 사용하는 Win32 C 코드를 호출하도록 설계되었습니다.__try/__except는 C 오류를 C++ try/catch와 유사한 예외 블록으로 변환합니다.

자세한 내용은 이 MSDN 문서를 참조하십시오.

표준 C++는 시도/캐치 블록을 사용하므로 표준 C++ 라이브러리를 기반으로 "표준" 예외 메커니즘이 필요하다면 이 블록을 사용하는 것을 권장합니다.

그러나 Windows SDK(윈도우 SDK)를 통해 제공되는 Structured Exception Handling(구조화 예외 처리)을 사용할 계획이라면 다음을 사용합니다.__try/__except.

일단 무언가를 던지면, 더 이상 그것을 어떻게 잡아야 할지에 대한 선택의 여지가 없습니다. C++ 를 던지는 경우throw), 그런 다음 사용합니다.try/catch .Windows)를 RaiseException), 그런 다음 사용합니다.__try/__except 것은 단지 에 불필요한 그것들을 섞으려고 노력하는 것은 단지 당신의 삶에 불필요한 번거로움을 더하는 것일 뿐입니다.

언급URL : https://stackoverflow.com/questions/3730654/whats-better-to-use-a-try-except-block-or-a-try-catch-block

반응형