標準のシステム例外をスローするにはどうすればよいですか (可能であれば、カスタム例外を作成してスローします)。
頭に浮かぶ最も簡単なことは、変数をゼロで除算することですが、それはせいぜい単なるハックです。
ライブラリで関数の言及を見つけAppGenerateException
ましたCmpApp
が、それに関するドキュメントも例も見つかりません。誰かがこれに関するドキュメントを教えてもらえますか?
好奇心から私AppGenerateException
はそれをチェックし、それを動作させました。この Codesys ヘルプ ページから助けを得ました。
これは、必要なものを達成するための最良の方法ではないと思いますが、うまくいく可能性があります。
残念ながら、私は 64 ビット システムを使用しており、私の知る限り、TRY..CATCH は他の 32 ビット システムではまだ機能していないため、キャッチをテストできませんでした。
次のライブラリを追加します。
次に、次のコードが機能するようです。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);
しかし、それは文書化されていないので、注意が必要です。