ぴぐノート

Good code is its own best documentation.

Boost C/C++

【Boost】boost::property_treeの例外処理を考えよう!

投稿日:2017年7月12日 更新日:

ライブラリなどを使用していると、「使い方は大体分かった!使ってみよう!」とすると微妙にはまってしまうことがあります。
前回前々回でお話しした文字コードもその一つですが今回は例外処理について考えてみます。

特に読み込み処理の部分で紹介した、read_xmlでファイルが存在しなかった場合やルート要素が見つからない場合について見てみましょう!

XMLファイルが見つからないヨ!

前々回紹介したXMLファイルの読み込みコードを見てみましょう。

このコードでread_xmlの引数に指定している、”booklist.xml”。
実行ファイルと同じパスに存在していれば問題ありませんが、実行ファイルとは異なる場所にある場合は例外がスローされます。


Debug版ではabort()が呼ばれた。

Release版では動作停止。

そのため、該当部分はtry ~ catch文で処理をしないといけません。

read_xmlでXMLファイルが見つからない場合は、std::runtime_errorから派生したboost::property_tree::xml_parser_error例外クラスがスローされるため、26行目でキャッチしてあげます。
そしてコンソール画面にエラー内容を表示して、エラー終了させると以下のように表示されます。

> ERROR : booklis.xml: cannot open file
booklis.xml…’t’が抜けていますネ!
「booklis.xmlは開けませんでした」と分かりやすいエラー内容になりました。

ルート要素が見つからないヨ!

サンプルにはもう一つ例外が投げられるパスがあります。
16行目の以下の部分です。

この部分ではXMLのルート要素を指定してルート要素以下の要素を取得しようとしていますが、ルート要素が間違っている場合、同じくstd::runtime_errorの派生クラス、boost::property_tree::ptree_bad_path例外がスローされます。


個別に対応する必要がなければどちらもstd::runtime_errorやその基底クラスstd::exceptionで補足してエラー対応でもいいかもしれませんネ。

まとめ

デバッグ中に実行時エラーが発生してげんなり。くらいならどうってことはないですがリリース後の実行時エラーを考えるとぞっとします。
ライブラリによっては戻り値でエラーか否かの判定ができる場合と例外スローの場合があるのでテスト作業やデバッグ中はわざと間違った引数を指定してみるのも大切です。

 

スポンサーリンク

スポンサーリンク

-Boost, C/C++

執筆者:

関連記事

【OpenCV】OpenCVをビルドして画像処理をしてみよう!

今日はOpenCVを使って画像表示をしてみたいと思います。 ツールやアプリケーションを作る場合、多かれ少なかれ画像処理は必要になってくるのではないでしょうか。 また画像処理関係ではまると泥沼化する場合 …

【Boost】boost::property_treeでXMLファイルを書き込もう!

前回の記事でXMLファイルの書き込みは難しくなくできそうでしたネ。 今回はXMLファイルの書き込みを行い、出力してみましょう。 読み込みと同じくライブラリファイルは不要で、ヘッダーファイルのみで利用で …

【MFC】マルチスレッドでプログレスバーを実装しよう その2

昨日に続き、プログレスバーをマルチスレッドを用いて実装してみましょう。 作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分かるこ …

C++でインターフェイスを作成しよう。

私事ですが今後業務ではC++を使用することになりそうです。 今まではウェブ関連の業務であったり、ちょっとしたテスト程度だったのでJavaを中心に使っていたため、C++の文法など少し忘れ気味です&#82 …

Eclipse NeonとCDT/MinGWでC++開発環境を作成しよう!(2)

前回の記事でEclipseにCDTを追加インストールすることができました。 今回はMinGWとMSYSをインストールし、Eclipse上でC++プロジェクトを実行してみましょう。 この際に必要なダウン …