« 視線の先 | メイン | 穏やかな独身生活 »
2006年03月24日
例外を投げつけないで
いろいろと書きたいことはあったとしても、ここに書くことじゃなかったりします。一応開発日記なんで、与太話やら社会的なネタばかりだと 「 看板に偽りあり 」 ということになってしまうわけで、今日は開発のちょっとした話。想定読者は CodeWarrior + POL で Palmware 開発をしている C++ プログラマ。つまりほとんどいない。
えぇと、かなり初期に作成した Palmware をイジっていまして、その作品は Palm のデータベースを使用していなかったんですね。で、データベースに設定などを保存するように改修すべく、最近の作品からデータベース関連のソースコードを引っ張ってきたのです。で、デバッグ。データベースを使用する Palmware でも、初回起動では当然データベースは 「 まだ 」 ありません。で、普通にデータベースをオープンしようとすると、当然エラーになります。エラーコードを確認して、「 あ、データベースが無いや 」 となればデータベースを作成する、と。まぁそんな実装にしているわけです。これで不都合なくやってきたのです。そのまんまいけるはず...おっと、デバッグセッションが固まった...なんで?
冒頭でちょいと書きましたが、陰郎は CodeWarrior9J で POL ( Palm Object Library ) を使用して開発しています。POL は Palm OS API をラップする C++ のクラスライブラリなのですが、デバッグセッションをやり直して POL のコードまで降りて見ると、どうやら C++ 例外が投入された様子。しかし、既存の作品 ( ぶっちゃけ MathPhilia ) ではデータベースが存在しなくても例外は投入されなかったぞ...? ははぁん、さてはプロジェクトの設定で C++ 例外処理が有効になっているな? そこを直せば...あれ、無効になっている。しかし、デバッグセッションでは確かに例外投入コードを通過する...と。なんだこれは。呪いかなにかかしら。
余談ですが、陰郎が C++ 例外を無効にするのは Palmware 開発でだけです。それ以外の場合は例外を普通に使用します。Palmware で使用しないのは、非力なデバイスで動作する場合のパフォーマンスを考えてのことだった気がするのですが、まぁ気にしすぎかもしれませんね。
で。POL ライブラリのレベルで例外が投入されるということはライブラリの設定か? と疑って見たところ、どうやら C++ 例外を使用するバージョンの POL ライブラリをリンクしているらしいということがわかりました。POL プロジェクトを作成するときに 「 C++ 例外処理を使用する 」 設定にした時点で、リンクライブラリは例外投入バージョンに設定されたと。でもってその後 C++ 例外を使用しないように設定したものの、リンクライブラリの設定は変更されなかった...と。うん、ライブラリが例外を投入しても、プロジェクトのコンパイル自体は例外処理を行わないため、デバッグセッションが固まってしまったと。うん、納得がいく。
結局、リンクライブラリを総入れ替えしたらこの奇妙な現象は収まってくれました。これまでどおり、エラーコードを返してくれる...と。うん、ばっちり。
投稿者 kagelow : 2006年03月24日 20:40
トラックバック
このエントリーのトラックバックURL:
http://www.project-enigma.jp/members/kagelow/locus/mt-tb.cgi/246