基本構文(15)

「Trap」による例外処理

例外処理を行うには「Trap」構文を利用します。Javaで言うと「Catch」です。

例外処理についてJavaと比べると、
  • Java」は例外監視範囲を「try」で指定しますが、
  • Monad」の場合はスクリプト全体が例外監視範囲になるようです。

「DivideByZeroException」をキャッチする(エラー表示+処理継続)

以下のスクリプトでは「$i」が0の時にゼロ除算で「DivideByZeroException」が発生します。
そこでTrapで「DivideByZeroException」をキャッチしてエラーメッセージを表示しています。

$i = 3
while ($i -ge -3)
{
    trap [DivideByZeroException]
    {
        "divide by zero trapped"
    }
    1 / $i--
}
実行結果
MSH C:\> $i = 3
MSH C:\> while ($i -ge -3)
>> {
>>     trap [DivideByZeroException]
>>     {
>>         "divide by zero trapped"
>>     }
>>     1 / $i--
>> }
>>
0.333333333333333
0.5
1
divide by zero trapped
Attempted to divide by zero.
At line:7 char:8
+     1 /  <<<< $i--
-1
-0.5
-0.333333333333333
  • Trapでキャッチしてメッセージを表示した後は、通常のエラー(行番号など)を表示し、処理を継続します。

「DivideByZeroException」をキャッチする(エラー表示+処理中止)

「trap」のスクリプトブロックで「break」を利用すると・・・

$i = 3
while ($i -ge -3)
{
    trap [DivideByZeroException]
    {
        "divide by zero trapped"
        break
    }
    1 / $i--
}
実行結果
MSH C:\> $i = 3
MSH C:\> while ($i -ge -3)
>> {
>>     trap [DivideByZeroException]
>>     {
>>         "divide by zero trapped"
>>         break
>>     }
>>     1 / $i--
>> }
>>
0.333333333333333
0.5
1
divide by zero trapped
Attempted to divide by zero.
At line:8 char:8
+     1 /  <<<< $i--
  • 通常のエラー(行番号など)を表示した後に処理を中止します。

「DivideByZeroException」をキャッチする(エラー非表示+処理継続)

「trap」のスクリプトブロックで「continue」を利用すると・・・

$i = 3
while ($i -ge -3)
{
    trap [DivideByZeroException]
    {
        "divide by zero trapped"
        continue
    }
    1 / $i--
}
実行結果
MSH C:\> $i = 3
MSH C:\> while ($i -ge -3)
>> {
>>     trap [DivideByZeroException]
>>     {
>>         "divide by zero trapped"
>>         continue
>>     }
>>     1 / $i--
>> }
>>
0.333333333333333
0.5
1
divide by zero trapped
-1
-0.5
-0.333333333333333
  • 通常のエラー(行番号など)を表示せずに処理を継続します。


参考:MSH Language and Syntax