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 | 使用する予定のタスクの数を教えてあげましょう |