C言語で例外処理(Exception)を使う【CException】

CExceptionというライブラリを使うと、C言語でもTry~Catchが書けるようになります。C言語でもスマートに例外処理を書けるようになりましょう。

CExceptionを使うとこんなに簡単に書ける

早速ですが、コード例を見て、CExceptionの威力を感じとっていただきたいと思います。

これは、あるパーティ会場に入場してから退場するだけのプログラムです。入場時には年齢確認をし、退場時には十分なチップを払ってもらいます。

 

CEXCEPTION_T e;
Try {
    Party_enter(age);
    Party_exit(chip);
    printf("funny!\n");

} Catch (e) {
    printf("badly... %d\n", e);
}

 

Try~Catchに見慣れた方には違和感なく読めますね。

対して、普通のC言語で書くと下記のようなコードになりますよね。

 

bool isPassed = false;
isPassed = Party_enter(age);
if (isPassed) {
    isPassed = Party_exit(chip);
    if (isPassed) {
        printf("funny!\n");
    } else {
        printf("badly... 2\n");
    }
} else {
    printf("badly... 2\n");
}

 

うんざりしてしまいますね。この時点でCExceptionの威力をわかっていただけたかと思います。

例外をキャッチする側はわかりましたが、例外をスローする側はどうなのでしょうか?もちろん、とても簡単に書けます。

 

void Party_enter(uint16_t age) {
    if (age < 20) {
        Throw(1);
    } else if (age >= 30) {
        Throw(1);
    }

    // do enter
}

void Party_exit(uint16_t chip) {
    if (chip < 100) {
        Throw(2);
    }

    // do exit
}

 

素晴らしい・・・。美しさすら感じてしまいますね。

 

CExceptionのインストール方法

CExceptionを使ってみたくなりましたか?

インストールも簡単なのですぐに始められますよ。下記の2つのファイルをダウンロードして一緒にビルドするだけです。

 

  • CException.h
  • CException.c

 

ダウンロードは下記のURLの『Download CException』からできます。ダウンロードしたらzipファイルを展開してlibフォルダの中を除けば、2つのファイルを見つけられます。

 

http://www.throwtheswitch.org/cexception

 

CExceptionの動作条件

察しの良い方はもう気付いているかもしれませんね。そうです、setjmp/longjmpを内部で使用しています。

なので、setjmp/longjmpの使える環境であればどこでも動きます。公式HPによると下記のプラットフォームでの動作確認済みとのことです。

 

  • IAR ARM 4
  • IAR ARM 5
  • gcc
  • clang

 

CExceptionをマルチタスク環境で使う

CExceptionはマルチタスク環境でも使えますよ。ただし、CExceptionがタスクのIDを知る必要があるので、ちょっとだけ設定変更が必要です。

 

項目 説明
EXCEPTION_GET_ID タスクIDを取得する関数を教えてあげましょう
EXCEPTION_NUM_ID 使用する予定のタスクの数を教えてあげましょう