ぴぐノート

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ライブラリを使ってサンプルプログラムをいくつか作成してみましょう。 OpenCVはすごく有名な画像処理ライブラリなのでインターネットで探せばサンプルプログラムはたく …

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

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

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

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

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

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

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

MFCなどを利用する場合にはほぼVisualStudio一択ですが、簡単なコンソールアプリケーションを作る場合にはEclipseのほうが便利な場合も多いです。 特に「普段はJavaで開発を行っているけ …