if (userRequest = "A") try add record1; onException myErrorHandler(12); end end
通常,try 块允许程序在发生错误的情况下继续进行处理。
try 块可以包含 onException 子句,如上所示。如果 try 块中的其中一个先前语句失败,则将调用该子句;但是,在不存在 onException 子句的情况下,try 块中的错误将导致调用紧跟在 try 块后的第一个语句。
EGL 提供一系列系统异常以指示运行时问题的具体特性。其中每个异常都是一个字典,您可以从中检索信息,但检索总是通过系统变量 SysLib.currentException(也是一个字典)进行的,它允许您访问运行单元中最近抛出的异常。
if (userRequest = "A") try add record1; onException case (SysLib.currentException.code) when (FileIOException) myErrorHandler(12); otherwise myErrorHandler(15); end end end
在此情况下,FileIOException 是常量,它相当于字符串值“com.ibm.egl.FileIOException”。EGL 异常常量总是等同于以“com.ibm.egl”开头的字符串中的最后一个限定符。
强烈建议只访问 onException 块中的异常字段。如果代码在没有发生任何异常的情况下访问 SysLib.currentException,运行单元将终止。
if (userRequest = "A") try add record01; onException case (SysLib.currentException.code) when ("com.ibm.egl.SQLException") if (SysLib.currentException.sqlcode == -270) myErrorHandler(16); else myErrorHandler(20); end otherwise myErrorHandler(15); end end end
有关系统异常的详细信息,请参阅 EGL 系统异常。
是否存在 try 块并不影响数字溢出处理。有关这些类型的错误的详细信息,请参阅 VGVar.handleOverflow。
if (userRequest = "B") try myVariable = myABC(); onException myErrorHandler(12); end end
EGL 提供了与错误相关的系统变量,在 try 块中设置这些变量以作为对成功事件的响应或对非终止错误的响应。在 try 块中以及在跟在 try 块后面运行的代码中可以使用那些变量的值,在大多数情况下,在转换(如果有的话)之后会恢复那些值。
当语句在 try 块外部运行时,EGL 运行时不更改任何与错误相关的变量的值。但是,程序可以在 try 块外部对与错误相关的变量赋值。
如果在 try 块中发生非终止错误,则 sysVar.exceptionCode 的值等同于当在 try 块外部发生错误时将向用户显示的 EGL 错误消息的数字组件。但是,特定于情况的变量(如 sysVar.errorCode 和 VGVar.mqConditionCode)的值是由运行时系统提供的。未发生错误时,sysVar.exceptionCode 的值与至少一个特定于情况的变量相同:8 个零的字符串。
发生非终止数字溢出时,将会把错误代码赋给 sysVar.exceptionCode 和 sysVar.errorCode,如 VGVar.handleOverflow 所述;但是,成功的算术计算不影响任何与错误相关的系统变量。
当将错误值赋给 sysVar.exceptionCode 时,将把相关 EGL 错误消息的文本赋给系统变量 sysVar.exceptionMsg,并将错误消息中的字节数(不包括结尾空格和 NULL)赋给系统变量 sysVar.exceptionMsgCount。在将 8 个零的字符串赋给 sysVar.exceptionCode 时,将把空白赋给 sysVar.exceptionMsg,并将把 sysVar.exceptionMsgCount 设置为 0。
该变量的缺省设置取决于属性 handleHardIOErrors 的值,该属性在可生成逻辑部件(如程序、库和 pageHandler)中可用。该属性的缺省值为 yes,它将变量 VGVar.handleHardIOErrors 的初始值设置为 1。
如果在 try 块外部发生硬 I/O 错误或软 I/O 错误,则生成的程序显示错误消息(如果有可能的话)并结束。
如果正在直接访问 DB2®(而不是通过 JDBC 进行访问),则硬错误的 sqlcode 是 304、802 或小于 0。
recordName is IOerrorValue recordName not IOerrorValue
如果不将逻辑表达式与 I/O 错误值配合使用而后更改数据库管理系统,则可能需要修改并重新生成程序。尤其是,建议您使用 I/O 错误值来测试错误,而不是使用 sysVar.sqlcode 或 sysVar.sqlState 的值。那些值取决于底层数据库实现。