私の最初の「深刻な」C ++ライブラリを設計するとき、私は次のことを自問しています:
例外を派生させるのは良いスタイルstd::exception
ですか?それは子孫ですか?!
読んだ後でも
まだわかりません。というのは、一般的な(ただし、良くないかもしれない)プラクティスに加えて、ライブラリユーザーとしてstd::exception
、ライブラリ実装で標準ライブラリ関数が失敗した場合にのみライブラリ関数がs をスローし、それについて何もできないと仮定するからです。しかし、それでも、アプリケーションコードを記述するとき、私にとっては非常に便利であり、また、単にをスローするだけでも見栄えが良いstd::runtime_error
です。また、私のユーザーは、定義された最小限のインターフェース(what()
コードやコードなど)に依存することもできます。
また、たとえば、ユーザーが誤った引数を指定した場合、をスローするよりも便利なのは何std::invalid_argument
ですか?だから、std :: exceptionのまだ一般的な使用と組み合わせて、他のコードで見ます:さらに進んで、カスタム例外クラス(例えばlib_foo_exception)から、そしてから派生してみませんかstd::exception
。
考え?
lib_foo_exception
クラスがから派生するstd::exception
場合、ライブラリユーザーはライブラリをキャッチlib_foo_exception
するだけでなく、ライブラリクラスのみをキャッチすることによってキャッチすることstd::exception
です。そのため、ライブラリ例外ルートクラスがstd :: exceptionを継承するかどうかを尋ねることもできます。
lib_foo_exception
です。「キャッチする方法はいくつありますか?」から継承するstd::exception
と、catch(std::exception)
ORで実行できますcatch(lib_foo_exception)
。から派生せずにstd::exception
、場合によってのみ、それをキャッチしますcatch(lib_foo_exception)
。
catch(...)
ます。この言語は、あなたが検討しているケース(および「誤動作」ライブラリー)を考慮しているためですが、それは現代のベストプラクティスではありません。
std::exception
あなたが意味するものではありません投げますstd::exception
。また、最初std::runtime_error
から継承しstd::exception
、what()
メソッドはからstd::exception
ではなくから来std::runtime_error
ます。また、などの一般的な例外をスローする代わりに、独自の例外クラスを作成する必要がありますstd::runtime_error
。