本主题涉及当您用 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”成员可以被用于增加缓冲区大小(如果需要)。
用户定义的扩展可在需要时通过为 returnCode 设置非空值来执行其自身错误恢复。实用程序函数调用返回到用户定义的扩展,并通过 returnCode 传递其状态。任何实用程序函数中发生的所有异常都必须传回到消息代理,以执行其他错误恢复,也就是在 returnCode 中返回 CCI_EXCEPTION 时。
为此,则在用户定义的扩展完成其自身错误处理后调用 cciRethrowLastException。调用 cciRethrowLastException 会导致 C 接口重新抛出上一个异常,从而可由消息代理中的其他层处理。注意,与 C exit 调用相似,cciRethrowLastException 在该情况下不返回。
如果发生异常并被用户定义扩展捕获,该扩展则不能调用任何其他实用程序函数,只能调用 cciGetLastExceptionData、cciGetLastExceptionDataW 或 cciRethrowLastException。 尝试调用其他实用程序函数会导致不可预测的行为,这可能会损害代理的完整性。
如果用户定义扩展遇到严重错误,则可以使用 cciThrowException 或 cciThrowExceptionW 生成由消息代理以正确方式处理的异常。 如果没有处理异常,则该异常的生成导致将提供的信息写到系统日志(syslog 或事件查看器)中。如果跟踪是活动的,则还会将信息写到代理跟踪中。
代理生成一组可以传递到用户定义扩展的异常。当遇到错误状态时,这些异常也可以由用户定义扩展生成。异常类是: