尝试抓住进展

时间:2014-04-17 08:03:08

标签: progress-4gl

是否有类似于php中的try catch的方法?

try {
    ...
} 
catch (Exception $e) {
    ...
} 

我已经使用过这种类型的块:DO ON ERROR UNDO ...但是我想知道是否还有其他方法可以做到。

感谢。

1 个答案:

答案 0 :(得分:3)

是。从版本11.2开始,BLOCK-LEVEL ON ERROR UNDO, THROW.语句会更改整个程序的默认行为。从版本10.1C开始,CATCH已存在更长时间。

/* Must be first line of program */
BLOCK-LEVEL ON ERROR UNDO, THROW.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

i = INTEGER("Hello").

CATCH err AS Progress.Lang.Error:    
    MESSAGE "Error: " err:GetMessage(1)        
        VIEW-AS ALERT-BOX ERROR.
END.

带有错误的旧式程序,例如取自Progress KnowledgeBase

的示例
DO ON ERROR UNDO, THROW:
  /* The following line raises error (138) which is diverted to a Progress.Lang.SysError object and thrown to the main block. */ 
  FIND Customer 1000.
END.

CATCH eAnyError AS Progress.Lang.Error:
  MESSAGE
      "Error Number:~t" eAnyError:GetMessageNum(1) "~n"
      "Error Text:~t" eAnyError:GetMessage(1)
      VIEW-AS ALERT-BOX BUTTONS OK TITLE "Error processing in the CATCH for mainprocedure block".
END CATCH.

关于错误的BLOCK-LEVEL的完整描述,然后

从手册:

  

语法BLOCK-LEVEL ON ERROR UNDO,THROW。

     

此语句会影响以下块类型:

     

外部程序的主要块(.p)

     

内部程序

     

用户定义的函数

     

班级方法

     

类构造函数

     

属性访问者

     

使用CREATE,DELETE,WRITE或作为数据库触发器的ON块   ASSIGN活动

     

REPEAT阻止

     

FOR blocks

     

DO TRANSACTION阻止

     

本声明不影响:
    破坏者

     

在单个非例程级块中显式编码的错误指令

     

ON块是UI触发器。

     

注意这些替代BLOCK-LEVEL ON ERROR UNDO,THROW   声明:
  你没有将语句添加到源代码文件中   可以使用-undothrow 2启动参数来更改默认值   对UNDO的错误处理,对每个受到影响的块都是错误的   编译期间的BLOCK-LEVEL语句。请参阅启动命令和   参数参考了解更多信息。

     

ROUTINE-LEVEL ON ERROR UNDO,THROW语句可用于你   想要仅在例程级别更改默认错误处理   块。 (您可以使用-undothrow 1启动参数来更改   例程级别块上的默认错误处理到UNDO,THROW期间   编译。)