오류 처리 및 반환 값
VSPackages 및 COM은 오류에 동일한 아키텍처를 사용합니다. SetErrorInfo
및 GetErrorInfo
함수는 Win32 API(애플리케이션 프로그래밍 인터페이스)의 일부입니다. IDE(통합 개발 환경)의 모든 VSPackage는 이러한 전역 Win32 API를 호출하여 오류 알림을 받을 때 풍부한 오류 정보를 기록할 수 있습니다. Visual Studio SDK는 오류 정보를 관리하는 interop 어셈블리를 제공합니다.
Interop 메서드
편의상 IDE는 Win32 API를 호출하는 대신 사용할 SetErrorInfo 메서드를 제공합니다. 관리 코드에서 SetErrorInfo를 사용합니다. HRESULT
오류가 메시지가 표시되어야 하는 수준에 도달하면(IOleCommandTarget 명령 처리기를 구현하는 개체인 경우가 많음) IDE는 다른 ReportErrorInfo 메서드를 사용하여 적절한 메시지 상자를 표시합니다. 관리 코드에서 ReportErrorInfo 메서드를 사용합니다.
VSPackage 구현자인 COM 개체는 일반적으로 ISupportErrorInfo
를 구현합니다. ISupportErrorInfo
인터페이스는 풍부한 오류 정보가 호출 체인 위로 수직 이동할 수 있게 합니다. 프로세스 간 또는 스레드 간에 사용될 수 있는 개체에서는 풍부한 오류 정보가 올바르게 호출자로 다시 마샬링되도록 ISupportErrorInfo
를 지원해야 합니다.
VSPackage와 관련되고 편집기 팩터리, 편집기, 계층 구조 및 제공된 서비스를 포함하여 IDE 확장과 관련된 모든 개체에서 풍부한 오류 정보를 지원해야 합니다. IDE는 이러한 VSPackage 개체에서 ISupportErrorInfo
를 구현하도록 요구하지 않지만 항상 권장됩니다.
IDE는 오류 정보를 보고하고 HRESULT
가 IDE로 전파될 때마다 Visual Studio 사용자에게 표시되어야 합니다. 또한 IDE는 ErrorInfo
개체를 만드는 메커니즘입니다.
일반 지침
SetErrorInfo 및 ReportErrorInfo 메서드를 사용하여 VSPackage 구현 내부 오류를 설정하고 보고할 수 있습니다. 그러나 일반적으로 VSPackage에서 오류 메시지 처리에 대한 다음 지침을 따릅니다.
VSPackage COM 개체에서
ISupportErrorInfo
를 구현합니다.IOleCommandTarget을 구현하는 개체에서 SetErrorInfo 메서드를 호출하는 오류 보고 메커니즘을 만듭니다.
IDE가 ReportErrorInfo 메서드를 통해 사용자에게 오류를 표시하도록 합니다.
IDE의 오류 정보
다음 규칙은 Visual Studio IDE에서 오류 정보를 처리하는 방법을 나타냅니다.
부실 오류 정보가 사용자에게 보고되지 않도록 하기 위한 방어 전략으로 ReportErrorInfo 메서드를 호출하는 함수는 먼저 SetErrorInfo 메서드를 호출해야 합니다. 새 오류 정보를 설정할 수 있는 모든 항목을 호출하기 전에 캐시된 오류 메시지를 지우도록
null
에 전달합니다.오류 메시지를 직접 보고하지 않는 함수는
HRESULT
오류를 반환하는 경우에만 SetErrorInfo 메서드를 호출할 수 있습니다. 함수에 대한 항목에서 또는 S_OK를 반환할 때ErrorInfo
를 지울 수 있습니다 . 이 규칙의 유일한 예외는 수신 당사자가 명시적으로 복구하거나 안전하게 무시할 수 있는HRESULT
오류를 호출에서 반환하는 경우입니다.HRESULT
오류를 명시적으로 무시하는 모든 당사자는 S_OK를 사용하여 SetErrorInfo 메서드를 호출해야 합니다. 그렇지 않으면 다른 당사자가 고유한ErrorInfo
를 제공하지 않고 오류를 생성하면ErrorInfo
개체가 우발적으로 사용될 수 있습니다.HRESULT
오류를 발생시키는 모든 메서드는 풍부한 오류 정보를 제공하도록 SetErrorInfo 메서드를 호출하는 것이 좋습니다. 반환HRESULT
된 오류가 특수FACILITY_ITF
한 경우 적절한ErrorInfo
개체를 제공하려면 메서드가 필요합니다. 반환된 오류가 표준 시스템 오류(예: E_OUTOFMEMORY, E_ABORT, E_INVALIDARG, E_UNEXPECTED 등)이면 SetErrorInfo 메서드를 명시적으로 호출하지 않고 오류 코드를 반환할 수 있습니다. 방어 코딩 전략으로HRESULT
오류가 발생하는 경우(시스템 오류 포함) 항상 실패를 자세하게 설명하는ErrorInfo
또는null
을 사용하여 SetErrorInfo 메서드를 호출합니다.다른 호출에서 발생한 오류를 반환하는 모든 함수는
ErrorInfo
개체를 수정하지 않고HRESULT
에서 실패한 호출로부터 받은 정보를 전달해야 합니다.