ぴぐノート

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++

執筆者:

関連記事

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

以前はアプリケーションの設定ファイルに単純なテキストである、INIファイルを用いていたアプリケーションも多かったですが、最近はXML(Extensible Markup Language:拡張可能なマ …

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

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

C++のプリプロセッサの復習をしよう その2 【#defineの活用】

前回に引き続き、C++のプリプロセッサの復習です。 前回は#includeと#defineについて記事にしましたが、【まとめ】にも記載の通り、#defineと関連するプリプロセッサは多くあります。 今 …

【Boost】オープンソースライブラリBoostをインストールしよう

普段からC++でのプログラムを作成していてBoost(ブースト)を知らないという人はあまり多くないかもしれませんが、「実はまだ使ったことない…」という人もいるのではないでしょうか? ライブ …

【MFC入門】メッセージボックスにエラーコードを表示させよう

ライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。 GetLastError関数(最新のエラーコードを取得する関数)がライブラリに含まれていることもありますが、そうでない …