如果没有,则异常将被渗透给调用堆栈,直到达到控制边界.docVIP

  • 8
  • 0
  • 约4.05万字
  • 约 31页
  • 2018-08-13 发布于江苏
  • 举报

如果没有,则异常将被渗透给调用堆栈,直到达到控制边界.doc

如果没有,则异常将被渗透给调用堆栈,直到达到控制边界

对其它类型的信息,异常将被渗透到程序的调用者。这个过程有处理异常功能,并有机会处理它。如果没有,则异常将被渗透给调用堆栈,直到达到控制边界。这时,异常被转化成一个功能检查,且异常处理又一次如上面描述的那样开始。 3.2.2.3.1 未处理“逃逸”信息的例子 下面描述出现一个escape逃逸信息时,产生这个信息的过程不能处理它,这个事件有如下的假设: 1、有两个程序,PGM1和PGM2运行在同一活动组。每一个程序分别包含一个过程PRC1和PRC2。 2、PRC1动态的调用PGM2且PRC2接收控制。 3、PRC1中的CALL操作码有一个错误指示器。 4、在PRC2中没有RPG异常处理编码。也就是对SUBST操作没设置错误指示器,也没*PSSR错误子例程。 5、PRC2有SUBST操作,且因子1是一负数。 当PGM1调用PGM2时,执行SUBST操作,生成一个异常信息“RNX0100”。图69给出说明及出现的事件。 调用堆栈 过程PRC1 错误Ind1Hdlr 调用PRC2 RPG缺省Hdlr 过滤没 处理的 例外 过程PRC2 —1 SUBST RPG缺省Hdlr 发布RNX0100 图69 对未处理逃逸信息的说明 如发生如下情况: 1、在PRC2中SUBST操作中没有错误指示器或*PSSR错误子例程,PRC2就不能处理 这个程序错误,所以异常不被处理。 2、因为异常不是一个功能检查,则它被渗透到PRC1。 3、PRC1接收(处理)这个异常信息,CALL操作的错误指示器置为ON。 4、接着执行PRC1中CALL操作后边的语句。 注意:同样的异常处理也适用于过程调用(CALLB操作码)。 3.2.2.3.2 未处理功能检查的例子 下面说明出现功能检查且不被处理的情况,假设: 1、有两个程序,PGM1和PGM2,分别包含过程PRC1和PRC2。 2、PRC1动态调用PGM2则PRC2接收控制。 3、PRC1中的CALL操作码没有错误指示器。 4、PRC2中没有编写RPG异常处理,也就是,没有错误指示器也没有*PSSR错误 子例程。 5、 PRC2有一个指针地址错误。 当PGM1调用PGM2时,由于基本指针定义为空,出现一个指针错误,这样必然 生成信息MCHB06。当PRC2试图渗透异常使其通过控制边界时,出现功能检查。 调用堆栈 活动的例外处理列表 过程PRC1调用PRC2 RPG缺省Hdlr 过滤 MCH3601 过程PRC2 D FLD S 5A BASED(PTR) RPG缺省Hdlr C EVAL PTR=NULL C EVAL FLD=‘ABCDE’ 发布MCH3601 调用堆栈 活动的例外处理列表 过程PRC1调用PRC2 RPG缺省Hdlr 过滤 CPF9999 过程PRC2 D FLD S 5A BASED(PTR) RPG缺省Hdlr C EVAL PTR=NULL C EVAL FLD=‘ABCDE’ 发布CPF9999 图70 给出这个说明和出现的事件 对未处理功能检查的说明,将发生下面情况: 1、由于在PRC2中无错误指示器,PRC2不能处理这个功能检查,所以它不被处理。 2、由于它是一个功能检查,则将发送一个询问信息以描述原始状况。 3、根据对询问信息的回答,PRC2可能会被结束,且异常渗透到PRC1(选“C”时) 或继续在PRC2中处理(选“G”时)。 3.2.2.4 优化考虑 当运行一个“*FULL”优化的程序,在优化的程序处理期间,在予先定义的某点上,优化器可能频繁使用寄存器中的值,并把它们恢复到内存,异常处理会打破这个正常的执行过程,后续程序在寄存器中的变量可能不会返回到分配给它们的存储位置。 特别的,如果通过下列方法恢复异常时可能不会包含当前值: *PSSR错误子例程 INFSR错误子例程 用户定义的异常处理 在询问信息中回答GO(‘G’) 在询问信息中回答Retry(‘R’) 即使使用全优化,ILE RPG/400自动定义指示器以使它们包含当前值,为确保字段或数据结构的内容是当前值,要在相应的定义规范表里指定NOOPT键字

文档评论(0)

1亿VIP精品文档

相关文档