🐕

オブジェクト指向Cコンパイラcomelangに例外処理を入れました

2024/11/06に公開

結局再実装してます。今度は無理なく実装したのでバグがあまりないと思います。
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