ぴぐノート

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

執筆者:

関連記事

C++のプリプロセッサの復習をしよう その1

C++を勉強していた時期から苦手だったのがプリプロセッサでした。 インクルートガードに#ifndefやら#defineやら#pragma onceやら…。 C++に限った話ではありませんが …

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

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

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

プログレスバーをマルチスレッドを用いた実装について最後の記事です。 引き続き作成の目的は、 スレッド実行中はモーダルダイアログを表示させること。 モーダルダイアログではプログレスバーを表示し進捗が分か …

【Boost】Boostライブラリの日付を使ってみよう!

先日の記事でBoostをインストールできたのでBoostのライブラリを使って遊んでみましょう。 今回は日付に関する情報をBoostから取得・表示したり、〇月〇日~□月□日が何日間あるか(期間)取得して …

【MFC】フォルダー選択ダイアログの表示【Visual C++】

出力先の指定などフォルダー選択のダイアログを表示させたいことがあります。 フォルダー選択ダイアログを表示させるためには、SHBrowseForFolder関数を使います。 SHBrowseForFol …