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