私の最初の「深刻な」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。