错误和异常处理

本主题涉及当您用 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 参数指定值时才可看到该异常。如果为 returnCode 指定空值,则发生异常:

这意味着用户定义的扩展不能自己来恢复错误。然而如果指定了 returnCode,且发生异常,则返回 CCI_EXCEPTION 代码。在这种情况下,cciGetLastExceptionDatacciGetLastExceptionDataW(区别是 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 在该情况下不返回。更新结束

如果发生异常并被用户定义扩展捕获,该扩展则不能调用任何其他实用程序函数,只能调用 cciGetLastExceptionDatacciGetLastExceptionDataWcciRethrowLastException。 尝试调用其他实用程序函数会导致不可预测的行为,这可能会损害代理的完整性。

如果用户定义扩展遇到严重错误,则可以使用 cciThrowExceptioncciThrowExceptionW 生成由消息代理以正确方式处理的异常。 如果没有处理异常,则该异常的生成导致将提供的信息写到系统日志(syslog 或事件查看器)中。如果跟踪是活动的,则还会将信息写到代理跟踪中。

异常和代理行为的类型

代理生成一组可以传递到用户定义扩展的异常。当遇到错误状态时,这些异常也可以由用户定义扩展生成。异常类是:

致命
当发生阻止代理处理继续安全执行的情况时,或在代理策略要终止进程的地方会生成致命异常。致命异常的示例有:未能获取关键系统资源,或是内部捕获的严重软件错误。 代理进程终止以下致命异常的抛出。
可恢复
当发生本不应终止但是必须结束当前消息流处理的错误时,生成可恢复异常。 可恢复异常的示例是,消息内容中的数据无效或无法将消息写到输出节点。当抛出可恢复异常时,在该线程上异常终止对当前消息的处理,但线程在它的输入节点重新开始执行。
配置
当配置请求失败时生成配置异常。这可能是因为配置请求格式中的错误或数据中的错误。当抛出配置异常时,请求被拒绝且返回错误响应消息。
解析器
这些由消息解析器生成,是为了那些阻止解析消息内容或创建位流的错误而生成的。解析器异常被视作代理可恢复异常。
转换
当试图转换为另一个数据类型时如果找到无效数据,则代理字符转换函数生成这些异常。转换异常被视作代理可恢复异常。
用户
当 Throw 节点抛出用户定义异常时生成这些异常。
数据库
当数据库管理系统在代理操作期间报告错误时生成数据库异常。数据库异常被视作代理可恢复异常。
相关概念
流调试器
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as01430_