0

我如何抛出标准系统异常(如果可能,创建自定义异常并抛出它们)。

想到的最简单的事情就是将变量除以零,但这充其量只是一种技巧。

AppGenerateException我确实在库中找到了一个函数的提及CmpApp,但我找不到它的任何文档,也找不到任何示例。任何人都可以为我指出一些文档吗?

4

1 回答 1

1

出于好奇,我检查AppGenerateException了它并让它工作。从这个 Codesys 帮助页面获得了一些帮助。

我仍然认为这不是实现您需要的最佳方式,但它可以工作。

不幸的是,我有 64 位系统,据我所知,TRY..CATCH 尚未在其他 32 位系统中工作,所以我无法测试捕获。

添加以下库:

  • CmpApp
  • 系统除外

然后下面的代码似乎工作。设置ThrowErr为 true 以获取系统异常。

PROGRAM PRG_TestThrow
VAR CONSTANT
    MY_PRIVATE_EXCEPTION : DWORD := 32001;
END_VAR
VAR
    ThrowErr    : BOOL; //Set this to TRUE to throw an error

    //The next two are for getting App instance
    _pApp       : POINTER TO CmpApp.APPLICATION;
    _Result     : SysExcept.SysTypes.RTS_IEC_RESULT;
END_VAR



//Get App instance
_pApp := AppGetCurrent(pResult := ADR(_Result));

IF ThrowErr THEN
    ThrowErr := FALSE;

    IF _pApp <> 0 THEN
        //Throw divide by zero exception
        AppGenerateException(pApp:=_pApp,   ulException:=RtsExceptions.RTSEXCPT_DIVIDEBYZERO);

        //You could use probably any available number as your own custom exception. 
        //For example the following works BUT not sure if it's ok to this.
        //AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

        //See RtsExceptions type for available exception codes. 
        //For my Codesys version, it has largest exception number of 0x2000 so all larger number are free (for now...)
    END_IF
END_IF

似乎可以使用任何自定义异常代码,例如:

AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

但它没有记录,所以我会小心。

于 2020-06-04T05:48:36.010 回答