이 주제에서는 C 프로그래밍 언어로 WebSphere Message Broker의 사용자 정의 확장을 개발할 때 고려해야 할 오류 및 예외 핸들링 관련 문제를 다룹니다. Java 프로그래밍 언어를 사용하여 사용자 정의 확장을 개발할 경우에는 표준 Java 오류 및 예외 핸들링 메소드를 사용할 수 있습니다. 예를 들어, WebSphere Message Broker가 내부적으로 예외를 전달할 경우, MbException 클래스의 Java 예외가 사용 가능하게 됩니다
올바른 오류 및 예외 핸들링은 올바른 브로커 조작을 위해 중요합니다. 사용자는 사용자 정의 확장이 오류 및 예외를 핸들링해야 하는 시점 및 방법을 알고 있어야 합니다.
Message Broker는 C++ 예외를 생성하여 오류 조건을 핸들링합니다. 이러한 예외는 브로커의 관련 소프트웨어 계층에서 포착되어 그에 따라 처리됩니다. 그러나 C로 작성된 프로그램은 C++ 예외를 포착할 수 없으며, 전달된 모든 예외는 기본적으로 C 사용자 정의 확장 코드를 무시하고 Message Broker의 보다 높은 계층에서 포착됩니다.
유틸리티 기능은 주로 리턴 값을 사용하여 요청된 데이터(예: 브로커 오브젝트의 주소 또는 핸들)를 다시 전달합니다. 리턴 값은 때때로 실패가 발생했음을 표시합니다. 예를 들어, 브로커 오브젝트의 주소 또는 핸들을 검색할 수 없는 경우, 0(CCI_NULL_ADDR)이 리턴됩니다. 또한 오류 조건의 이유가 리턴 코드 출력 매개변수에 저장되며, 이 매개변수는 일반적으로 모든 유틸리티 기능의 기능 프로토타입의 일부입니다. 유틸리티 기능이 완료되고 returnCode가 널(null)이 아니면, returnCode에 CCI_SUCCESS가 포함됩니다. 그렇지 않은 경우에는 아래에 설명된 리턴 코드 중 하나가 포함됩니다. 유틸리티 기능이 완료되었는지 여부를 판별하기 위해 returnCode의 값을 항상 안전하게 테스트할 수 있습니다.
이것은 사용자 정의 확장이 자체 고유의 오류 복구를 수행할 수 없음을 의미합니다. 그러나 returnCode 매개변수가 지정된 상태에서 예외가 발생하면 CCI_EXCEPTION 리턴 코드가 리턴됩니다. 이 경우 cciGetLastExceptionData 또는 cciGetLastExceptionDataW(cciGetLastExceptionDataW가 유니코드 추적 텍스트가 포함될 수 있는 CCI_EXCEPTION_WIDE_ST를 리턴한다는 점과 다름)를 사용하여 발생한 예외의 유형에 대한 진단 정보를 확보할 수 있습니다. 데이터는 CCI_EXCEPTION_ST 또는 CCI_EXCEPTION_WIDE_ST 구조로 리턴됩니다.
해제할 자원이 없으면, 사용자 정의 확장에서 returnCode 인수를 설정하지 말 것을 권장합니다. 이 인수를 설정하지 않으면 예외가 사용자 정의 확장을 무시할 수 있습니다. 그런 다음 이러한 예외는 브로커에 의해 WebSphere Message Broker 스택의 보다 높은 계층에서 핸들링될 수 있습니다.
메시지 삽입은 CCI_EXCEPTION_ST 구조의 CCI_STRING_ST 구성원으로 리턴될 수 있습니다. CCI_STRING_ST를 통해 사용자 정의 확장은 필요한 삽입을 수신하는 버퍼를 제공할 수 있습니다. 브로커는 이 버퍼로 데이터를 복사하고 출력된 바이트 수와 실제 데이터 길이를 리턴합니다. 버퍼가 충분히 크지 않으면 데이터가 복사되지 않으며, 필요한 경우 "dataLength" 구성원을 사용하여 버퍼의 크기를 증가시킬 수 있습니다.
사용자 정의 확장은 필요한 경우 오류 복구를 수행할 수 있습니다. CCI_EXCEPTION이 리턴되면, 추가 오류 복구가 수행되도록 모든 예외를 Message Broker로 다시 전달해야 합니다. 이러한 조치는 cciRethrowLastException을 호출하여 수행되며, 이 기능은 Message Broker의 다른 계층에서 마지막 예외가 핸들링될 수 있도록 C 인터페이스로 하여금 마지막 예외를 다시 전달하게 합니다.
예외가 발생하여 사용자 정의 확장에 의해 포착될 경우 확장은 cciGetLastExceptionData, cciGetLastExceptionDataW 또는 cciRethrowLastException을 제외하고 어떠한 유틸리티 함수도 호출할 수 없습니다. 다른 유틸리티 기능을 호출하려 하면, 브로커의 무결성을 손상시킬 수도 있는 예상치 못한 작동이 초래됩니다.
사용자 정의 확장에서 심각한 오류가 발생하면 cciThrowException 또는 cciThrowExceptionW을 사용하여 Message Broker가 처리할 예외를 올바르게 생성할 수 있습니다. 그러한 예외의 생성으로 인해, 예외가 처리되지 않은 경우 제공되는 정보가 시스템 로그(syslog 또는 Eventviewer)에 기록됩니다. 추적이 활성 상태인 경우 정보는 또한 브로커에 기록됩니다.
브로커는 사용자 정의 확장으로 통지되는 일련의 예외를 생성합니다. 이러한 예외는 오류 조건이 발견될 때 사용자 정의 확장에 의해 생성될 수도 있습니다. 예외 클래스는 다음과 같습니다.