C++の例外のwhat関数とそれに関連して

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

C++の例外のwhat関数とそれに関連して

投稿記事 by zxc » 10年前

 std::exceptionのリファレンス
 これによるとコンストラクタの引数型はconst参照かデフォルトなものの2つしかない。コピーするのはすぐには思いつかないけれどきっとあると便利で、無いと結構不便だったりしそう。デフォルトなものはあって欲しい。
 
 でもこれだとwhat()が返す文字列がそのクラスで共通になる、と今思っている。しかしそんなものと知らずに「何でwhatがvirtualなんだ?返す文字列変えれば良いじゃない?コンストラクタなりで文字列渡そう」と思ってコンストラクタで文字列受け取る自己定義例外クラスを今まで作ってたわけで・・・うぅ。つまり今までの自己定義は間違いで、もしある例外とまた別の例外とを区別したいのならばそれは例外クラスの型として表現すべき、つまり「インスタンス毎に返す文字列が異なる」じゃなく「例外クラスごとに返す文字列が異なる」ようになされることが考えられているのだろうか。

 だから もし同じ例外が複数の箇所から同じcatchに投げられうるならば、その解決はある例外がcatchする範囲のどこ由来であっても同じ方法で解決されなければならず、それができないなら型を変えることが必要 ということ?
 例外にどのインスタンスが原因かという詳細な情報を文字列で任せるのは間違いで、どういう性質の例外が生じたのかというシグナルの伝達体として用い、より詳細な情報の伝達はシグナルの受信者とシグナルの発信者の相互作用でなされるべきだ ということかな?
確かにこの方が逐一文字列を与えるよりコンパクトだし楽な気がする。(もちろん例外クラスで詳細伝えるのも出来るけど一般的じゃなさそうだし面倒だと感じているので多用したくない)

 とりあえずこういう理解で行こう

constexpr
記事: 5
登録日時: 10年前

Re: C++の例外のwhat関数とそれに関連して

投稿記事 by constexpr » 10年前

c++の例外機構は型システムを利用するのを想定している。
もちろん型は一つで、whatで返す文字列だけを変える事もできるが、その場合は例外の判別はcatch節で分岐を行う必要が出てくる。
例外そのものを型で表現する事で、階層化やキャッチの分岐を直感的に実装できる。
もし対処する処理が同じなら同じ型でキャッチすれば良いし、詳細に分けたければ同じ型をそれぞれ継承する事で階層化された例外をそのまま作れる。
whatでは親クラスのwhatを呼び出したのちに自身の出力を行うなどする事だってできる事も忘れずに。
最後に編集したユーザー constexpr on 2015年4月28日(火) 04:50 [ 編集 1 回目 ]