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 に答える