CLR에서 throw std::exception을 하면 SEHException이 발생합니다

테스트를 좀 해 봤는데요.

원인

C++/CLI Managed 런타임 환경에서 Unmanaged 예외를 발생시키면 CLR은 내부적으로 PInvoke를 통한 마샬링이 발생되고, 그 과정에서 SEHException 예외가 발생되어 유저 코드상에서는 catch가 되지 않습니다.
예외 발생 이후 catch가 가능합니다.
그래서 C++/CLI 상에서 예외를 발생시키시고 싶으시면 Managed 예외를 발생 시켜야 합니다.

image
image

Invoke 함수에서 Lib는 네이티브 클래스이며, invoke 함수 호출시 std::exception이 발생됩니다.
앞서 말씀드린 것처럼 C++/CLI 상에서 UnManaged 예외이므로 PInrovke에 의한 SEHException이 발생됩니다.

Invoke2 함수에서 gcnew를 통한 Managed 예외는 PInvoke가 발생되지 않아 c# 런타임까지 그대로 예외가 전달 됩니다.

참고자료

아래부터는 참고 했던 자료입니다.
C++/CLI 상의 rethrow 에 대한 설명 문서입니다.
image

C++/CLI 상에서 UnManaged 예외 발생시 PInvoke가 일어나는 과정에 대한 문서입니다
image

그리고 그것에 대한 질문/답변입니다.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/8a710bde-d9d0-490e-8d87-4a913c9bcd37/unexpected-sehexception-in-ccli-code?forum=vcgeneral

마지막으로 혹시 codeproject에 질문하셨나요? 맞다면 무섭네요 ;; 금새 검색이 ㅎㅎ

결론

C++/CLI 상에서는 Managed 예외를 사용하세요.
불가피하게 UnManaged 예외를 받아야 되는 상황이면, SEHException은 무시하시고, Exception^으로 캐치하여 후처리를 작성하세요.
image

ps. 작성했던 예제가 필요하시면 첨부하도록 하겠습니다~

4개의 좋아요