불행히도 이것은 세부적인 사항은 아닙니다. COM 클라이언트 코드가 반환 값 HRESULT를보고 특정 값에 반응하는 것은 드문 일이 아닙니다. 버그 해결 방법 일 수도 있고 사용자 정의 오류보고 일 수도 있으며 "실패 할 것으로 예상됩니다. 다음에이 작업을 수행하십시오"코드 흐름 일 수 있습니다. 그런 종류의 코드는 얼마나 복잡합니까? COM 구성 요소가 얼마나 오랫동안 지속되었고 얼마나 귀찮았는지와 관련이 있습니다.
그러나 예, 매우 역 엔지니어링하기가 어렵습니다. 클라이언트 코드 프로그래머를 인터뷰하고 그가하는 일을 묻는 기회를 찾으십시오. 원본 코드를 검토하십시오. 이전에 특정 HRESULT를 반환 한 곳이면 .NET 교체에서 다시 해당 작업을 수행해야합니다. Marshal.ThrowExceptionForHR()을 사용하십시오.
.NET 자체는 좋은 COM 오류보고에 대한 훌륭한 지원을 제공합니다. [ComVisible] 클래스 메쏘드에 던진 예외는 자동으로 잡아서 호출자에게 반환 된 HRESULT에 매핑됩니다. CLR은 IErrorInfo를 구현하여 클라이언트가 HRESULT 이상의 텍스트 설명을 포함하는 부유 한 오류 정보를 얻을 수 있도록합니다. 그래서 Exception.Message는 클라이언트가 인터페이스를 사용한다고 가정 할 때 잃어 버릴 필요가 없습니다.
모든 표준 .NET 예외 파생 개체는 COM에서 허용하는 한 논리적 매핑을 사용하여 특정 HRESULT에 매핑됩니다. OutOfMemoryException은 E_OUTOFMEMORY에 매핑되고 ArgumentException은 ERROR_INVALID_PARAMETER에 매핑되고 IOException은 원래 winapi 오류 코드 등으로 매핑됩니다. 클라이언트 코드가 HRESULT 만 표시하거나 기록하는 경우에도 원본 .NET 예외로 다시 매핑하는 방법은 여전히 있습니다.
물론 Holy Stack Trace가 없으면이를 로깅하는 것이 좋습니다. 시도/잡기/던지기 코드를 작성하는 것은 매우 고통 스럽지만 칩이 떨어지면 절대적으로 가치가 있습니다. 그들은 내려갈 것이다.