オブジェクト指向Cコンパイラcomelangに例外処理を入れました
結局再実装してます。今度は無理なく実装したのでバグがあまりないと思います。
Ruby, Ptyhon, Javaみたいなのを前回入れてましたが、バグだらけで、再実装しました。
Rustに近いと思います。
ライブラリでは正規表現に例外処理を入れてます。正しくない正規表現を.rescueで捕捉できます。
以下が例です。
Exception
#include <comelang.h>
exception int fun()
{
return 1;
}
exception int fun2()
{
return fun().exception_throw;
}
int main(int argc, char** argv)
{
int a = fun2()!!;
printf("a %d\n", a);
puts("HEHE");
return 0;
}
a 1
HEHE
#include <comelang.h>
exception int fun()
{
return none(s"Err");
}
exception int fun2()
{
return fun().exception_throw;
}
int main(int argc, char** argv)
{
int a = fun2()!!;
printf("a %d\n", a);
puts("HEHE");
return 0;
}
Err
#include <comelang.h>
exception int fun()
{
return none(s"Err");
}
exception int fun2()
{
return fun().exception_throw;
}
int main(int argc, char** argv)
{
int a = fun2().rescue {
puts("CATCH");
puts(Err);
3
}
printf("a %d\n", a);
puts("HEHE");
return 0;
}
CATCH
Err
a 3
HEHE
ChatGPT:
ChatGPT
この例外処理の実装はとても興味深いです!例を見てみると、comelangでの例外処理の設計がよくわかりますね。
例外処理の流れ
exception修飾子:exceptionを使って関数を宣言すると、その関数は例外を返す可能性があることが示されます。戻り値がエラーになる可能性があるため、呼び出し元で例外をキャッチして適切に処理できます。
例外のスロー:none(s"Err")で文字列としてエラーを返すことで、例外をスローしています。
exception_throwでの伝播:exception_throwを用いることで、上位の関数へ例外を伝播させます。
!!による例外ハンドリング:!!を使って関数の呼び出しを行うと、例外がスローされていない場合は正常値を受け取り、例外が発生した場合はエラーメッセージが出力されます。
rescueによる例外のキャッチ:例外が発生した場合、rescueブロック内でキャッチしてエラー処理を行います。この例では、エラーメッセージ「CATCH」と「Err」を表示し、代替の値として3を返しています。
実行結果
最初の例では、正常な値を返してaに1が代入され、HEHEが表示されます。
二番目の例では、例外が発生し、エラーメッセージ「Err」が表示されてHEHEが出力されません。
三番目の例では、rescueブロックで例外がキャッチされ、エラーメッセージ「CATCH」と「Err」が表示され、aには3が代入されます。その後、HEHEが出力されます。
Discussion