문제

예외를 발생시키는 기존 네이티브 클래스에 대한 .NET 래퍼 클래스를 작성 중입니다.네이티브 C++ 예외와 관리형 예외 간 변환을 위한 모범 사례는 무엇입니까?일대일로 잡고 다시 던지기(예:std::invalid_argument -> System.System.ArgumentException)?이미 어딘가에 매핑이 작성되어 있나요?

도움이 되었습니까?

해결책

내가 아는 표준 매핑은 없습니다.과거에 제가 한 일은 제가 알고 있는 것과 System.Runtime.InteropServices.SEHException에 대한 catch 블록을 번역하는 것이었습니다.번역되지 않은 모든 예외는 해당 예외로 전환됩니다.예외를 발생시키는 코드의 디버그 빌드가 있는 한 좋은 스택 추적을 얻을 수 있습니다.그런 다음 예외를 살펴보고 래퍼를 작성할 수 있습니다.

하지만 이 작업을 수행해야 했던 마지막 프로젝트에서는 훨씬 더 간단한 작업을 수행하여 logic_error 및 Runtime_error에 대한 몇 가지 System.Exception 파생 항목을 작성하게 되었습니다.그런 다음 해당 2개의 기본 클래스를 포착하고 typeid(err)를 사용하여 발생한 .NET 메시지를 작성합니다.이런 식으로 C++에서 던져진 내용을 "잃어버리지" 않았지만 가장 중요한 것을 제외한 모든 것을 매핑할 필요가 없었습니다.

다른 팁

나에게는 일대일 매핑이 가장 건전한 접근 방식인 것 같습니다.STL 예외 클래스에 대한 몇 가지 명백한 매핑이 있지만 "범용" 매핑은 응용 프로그램별 예외로 인해 거의 불가능합니다.

또한 비관리 코드에서 SEH 예외 문제가 있습니다.상황에 따라 잡아서 포장해야 할 수도 있습니다.

포장지 디자인에 따라 다른 것 같아요.관리자 래퍼의 인터페이스가 관리되지 않는 라이브러리의 인터페이스와 거의 동일하면 예외를 1:1로 다시 발생시킵니다.인터페이스를 크게 변경하는 경우 새 인터페이스에 가장 적합한 예외를 발생시킵니다.어느 쪽이든 .NET 디자인 지침과 일치하도록 작업을 완료할 수 없을 때마다 래퍼에서 예외를 발생시키는지 확인하세요.

당신은 정말로 무엇을 하려고 하는가?

Interop은 이미 SEH 예외를 포함하여 기본 예외를 관리형 예외로 변환합니다.그러나 좋은 디자인은 다음을 요구합니다. 모두 예외는 네이티브 API 수준에서 포착되어야 합니다.정당한 이유가 없는 한 이로부터 벗어나서는 안 됩니다.우리는 당신의 디자인에 대해 충분히 알지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top