まあできるだろうとは思いましたが、念の為確認してみました。
結論としては、他のプログラミング言語の関数と同じく、アクションの再帰呼び出し(アクション内から同じアクションを別のパラメータで呼ぶような処理)が書けました。
実験用アクションの定義
Server Actionとして、「Factorial」を定義。
Input Parameter: N(Integer)
Output Parameter: Result(Integer)
受け取ったNに対して階乗の値を計算し、Resultにセットすることで返します。
入力が0のとき0!=1より1を返し(Switchの右側、1のフロー)、
正の値のときN*Factorial(N-1)を再帰的に呼出して、結果をResultに設定します(Switchの下側、Otherwiseのフロー)。
こんな感じです。
入力が負の値の場合は、Raise ExceptionアクションでModule内の独自User Exceptionをスロー、本来ならオーバーフロー対策もすべきですが、テスト目的なのでここでは省略。
動作確認
モバイルのスクリーンを作成して動作確認してみました。
Buttonクリックで作成したアクション「Factorial」を呼んで、ラベルに結果を記入しています。右側の例外処理は、間違ってパラメータに負の値を渡したときに返ってきたメッセージを表示しています。
デバッガで、再帰呼び出し中(当初N=10で呼んで、6回目の再帰呼び出し中)にブレークポイントで止まったときのThreadsの様子。アクション呼び出しが溜まっているのが見えますね。
(補足)もしかしてカスタムExceptionはPublicにできない?
アクション側で例外定義しているのに、利用側ではその例外を利用していないのは、例外をPublicに設定する事ができなかったからです。
公式のideasでも話題になっていますね。カスタムExceptionをPublicにして他のeSpaceから参照できるようにしたいという内容で(つまり、実際にPublicにできないのだと思います)。
最初に投稿されたのが2010年だけど、2018/07時点でまだ対応されたという報告はあがっていません。
https://www.outsystems.com/ideas/100/allow-custom-exceptions-to-be-public-and-referenced-from-other-espaces