😽

comelangに例外処理が、入りました

2024/10/24に公開
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    return fun();
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
OK
x 1
#include <comelang.h>

exception int fun()
{
    return none(s"ERR");
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
ERR
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2();
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
y 1
OK
x 9
#include <comelang.h>

exception int fun()
{
    return none(s"ERR");
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return 9;
}

int main(int argc, char** argv)
{
    int x = fun2().rescue {
        puts("UHO!");
        puts(Err);
        return 0;
    }
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
UHO!
ERR
#include <comelang.h>

exception int fun()
{
    return 1;
}

exception int fun2()
{
    int y = fun();
    
    printf("y %d\n", y);
    
    return none(s"ERR");
}

int main(int argc, char** argv)
{
    int x = fun2().rescue {
        puts("UHO!");
        puts(Err);
        return 0;
    }
    
    puts("OK");
    printf("x %d\n", x);
    
    return 0;
}
y 1
UHO!
ERR

exceptionを戻り値に持つ関数の中ではreturn none(string);が使えます。これを呼び出すと例外が発生します。stringは例外のメッセージです。呼び出し元の関数では.resuceしないと例外の文字列を表示してexitしてしまいます。.resuceすると例外が発生してもプログラムは終了しません。.resuceの中ではErrという変数に例外のメッセージが入ってます。関数がネストする場合はexceptionを呼び出し元の関数につけると深いネストでもreturn none(string);された時点で大域脱出して.resuceで例外を捕捉できます。

https://github.com/ab25cq/comelang

Discussion