本主题涉及当您用 C 程序设计语言为 WebSphere Message Broker 开发用户定义扩展时需要考虑的错误和异常处理的相关问题。如果您使用 Java 程序设计语言开发用户定义扩展,则您可以使用标准 Java 错误和异常处理方法。例如,如果 WebSphere Message Broker 在内部抛出异常,则类 MbException 的 Java 异常可用。
正确的错误和异常处理对正确的代理操作很重要。您应该知道和了解用户定义扩展如何和何时需要处理错误和异常。
消息代理生成 C++ 异常以处理错误状态。在代理的相关软件层捕获这些异常并进行相应处理。然而,用 C 编写的程序无法捕获 C++ 异常,且缺省情况下任何抛出的异常绕过任何 C 用户定义扩展代码并被消息代理的更高层捕获。
按约定,实用程序函数通常使用返回值传回请求的数据,例如,代理对象的地址或句柄。 有时返回值表明发生失败。例如,如果无法检索代理对象的地址或句柄,则返回 0(CCI_NULL_ADDR)。另外,错误状态存储在返回码输出参数中的原因是约定的所有实用程序函数的部分函数原型。如果实用程序函数成功完成且 returnCode 不为空,则 returnCode 将包含 CCI_SUCCESS。否则,它将包含以下描述的返回码之一。总是可以安全地测试 returnCode 的值以确定实用程序函数是否成功。
这意味着用户定义的扩展不能自己来恢复错误。然而如果指定了 returnCode,且发生异常,则返回 CCI_EXCEPTION 代码。在这种情况下,cciGetLastExceptionData 或 cciGetLastExceptionDataW(区别是 cciGetLastExceptionDataW 返回可以包含 Unicode跟踪文本的 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,则所有异常必须被传回到消息代理以便执行其他错误恢复。这通过调用 cciRethrowLastException 执行,这导致 C 接口重新抛出最后的异常以使它可以在消息代理的其他层中被处理。
如果发生异常并被用户定义扩展捕获,则扩展不能调用任何实用程序函数,除了 cciGetLastExceptionData、cciGetLastExceptionDataW 或 cciRethrowLastException。 调用其他实用程序函数的试图将导致不可预测的行为,这可能泄露代理的完整性。
如果用户定义扩展遇到严重错误,则可以使用 cciThrowException 或 cciThrowExceptionW 生成由消息代理以正确方式处理的异常。 如果没有处理异常,则该异常的生成导致将提供的信息写到系统日志(syslog 或事件查看器)中。如果跟踪是活动的,则还会将信息写到代理跟踪中。
代理生成一组可以传递到用户定义扩展的异常。当遇到错误状态时,这些异常也可以由用户定义扩展生成。异常类是: