COM+에서 오류를 처리하기 위한 전략
이 항목에서는 COM+용 구성 요소를 개발할 때 유의해야 할 몇 가지 오류 처리 전략을 설명합니다.
모든 구성 요소 인터페이스의 모든 메서드에 대한 HRESULT 값을 반환합니다. COM+는 HRESULT 값을 사용하여 함수 호출 또는 인터페이스 메서드 호출의 오류를 보고합니다. HRESULT는 메서드가 성공 또는 실패했는지 여부를 나타내며 인터페이스별 오류에 대한 RPC, WIN32 또는 ITF와 같은 오류와 관련된 기능을 식별합니다. 또한 시스템 API는 HRESULT에서 오류 조건을 설명하는 문자열로 조회를 제공합니다. HRESULT 값을 반환하는 메서드를 사용하는 것은 잘 작성된 구성 요소의 기본 사항이며 디버깅 프로세스에 필수적입니다. Microsoft Visual Basic은 HRESULT를 사용하여 각 메서드를 반환으로 자동으로 정의합니다. Microsoft Visual C++에서는 HRESULT를 명시적으로 반환해야 합니다. HRESULT에 대한 자세한 내용은 COM 오류 코드의 구조를 참조 하세요.
개발 도구에서 제공하는 모든 수단을 사용하여 ErrorInfo 컬렉션 개체를 시작합니다. ErrorInfo 컬렉션 개체는 아파트 경계를 넘어도 개체가 호출자에게 풍부한 오류 정보를 전달(또는 throw)할 수 있도록 허용하기 때문에 COM 예외라고도 합니다. 이 제네릭 오류 개체의 값은 HRESULT를 보완하여 호출자에게 반환할 수 있는 오류 정보의 유형을 확장한다는 것입니다. 각 ErrorInfo 컬렉션 개체는 컨텍스트 설명, 오류의 원본 및 오류를 발생시킨 메서드의 인터페이스 식별자를 반환합니다. 도움말 파일에 항목에 대한 포인터를 포함할 수도 있습니다. Automation은 오류 개체를 관리하는 세 가지 인터페이스를 제공합니다. 구성 요소는 ISupportErrorInfo Automation 인터페이스를 구현하여 ErrorInfo 컬렉션에 대한 지원을 보급해야 합니다. 오류가 발생하면 구성 요소는 ICreateErrorInfo 자동화 인터페이스를 사용하여 오류 개체를 초기화합니다. 호출자가 HRESULT를 검사하고 메서드 호출이 실패한 것을 발견한 후 개체를 쿼리하여 ErrorInfo 컬렉션을 지원하는지 확인합니다. 이 경우 호출자는 IErrorInfo Automation 인터페이스를 사용하여 오류 정보를 검색합니다. Visual Basic 프로그래머는 Err 개체를 통해 노출되는 ErrorInfo 컬렉션 개체에 쉽게 액세스할 수 있습니다. Err Raise 함수를 사용하여 오류를 발생시키고 On Error 문을 사용하여 오류를 catch할 수 있습니다. Visual Basic 런타임 계층은 매핑을 처리합니다. Visual C++ COM 컴파일러 지원을 사용하는 경우 _com_raise_error 클래스를 사용하여 오류를 보고하고 _com_error 클래스를 사용하여 오류 정보를 검색할 수 있습니다. COM+는 기존 C++ 예외를 확장 된 IErrorInfo 정보로 전파하지 않습니다. ErrorInfo 컬렉션 개체에 대한 자세한 내용은 Automation 가이드의 "오류 처리"를 참조하세요.
참고 항목
COM을 사용하려면 모든 ErrorInfo 컬렉션 개체가 값으로 마샬링되어야 합니다. 이는 IErrorInfo Automation 인터페이스를 구현하는 구성 요소도 IMarshal 인터페이스를 구현하고 지원해야 함을 의미합니다. IMarshal 인터페이스 구현은 구성 요소에 대한 값으로 마샬링을 지원해야 합니다.
트랜잭션을 사용하여 공유 리소스 오류를 관리합니다. 자동 트랜잭션은 상태 관리 리소스 관리자를 사용할 때 작성해야 하는 오류 처리 코드의 양을 크게 줄일 수 있습니다. 그러나 트랜잭션은 오류 처리가 전혀 필요하지 않습니다. 여전히 인터페이스 메서드에서 오류 코드를 반환하고 호출자 내에서 해당 오류 코드를 확인하여 종료된 트랜잭션에 대해 불필요한 작업을 수행하지 않아야 합니다. 오류 처리와 트랜잭션 처리를 결합하는 방법에 대한 자세한 내용은 루트 개체에 알림으로써 트랜잭션 속도를 높이기를 참조 하세요.
명시적으로 오류를 발생합니다. 개체가 명시적으로 오류를 발생시키지 않는 한 오류 정보가 개체를 벗어나지 않도록 합니다. 도구에서 생성된 모든 오류를 catch하고 구성 요소 코드에서 처리합니다. 최소한 일관된 방식으로 예기치 않은 오류를 보고하는 표준 처리기를 포함합니다.
FACILITY_ITF 범위의 오류를 사용하여 인터페이스별 오류를 보고합니다. 인터페이스별 오류는 0x0200 0xFFFF 사이의 FACILITY_ITF 오류 범위에 있어야 합니다. Visual Basic에서 사용자 지정 오류 코드를 vbObjectError의 오프셋으로 정의할 수 있습니다. 다음 예제와 같이 C++의 MAKE_HRESULT 매크로를 사용하여 인터페이스별 오류 코드를 도입합니다.
const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
관련 항목