1. ホーム
  2. c++

[解決済み] std::runtime_error と std::exception() の違い。

2022-05-10 15:51:13

疑問点

とはどのような違いがあるのでしょうか? std::runtime_errorstd::exception ? それぞれどのような使い方が適切なのでしょうか?そもそもなぜ違うのでしょうか?

どのように解決するのですか?

std::exception は、例外階層の基底クラスとして機能することのみを目的としたクラスです。それ以外の用途はありません。言い換えれば、概念的には 抽象的なものです。 クラスです(C++の意味での抽象クラスとして定義されていないにもかかわらず)。

std::runtime_error は、より専門的なクラスで std::exception から派生したもので、様々な 実行時 エラー時に投げられるように意図されています。これは2つの目的を持っています。それ自体で投げることもできますし、より特殊なタイプの実行時エラー例外、たとえば std::range_error , std::overflow_error などです。の順に、独自の例外クラスを定義することができます。 std::runtime_error から始まる独自の例外クラスを定義することができます。 std::exception .

と同じように std::runtime_error のように、標準ライブラリには std::logic_error から派生したものであり、また std::exception .

このような階層を設ける意味は、C++の例外処理機構をフルに活用する機会をユーザに与えることです。catch'句は多相な例外を捕らえることができるので、ユーザは例外階層の特定のサブツリーから例外タイプを捕らえることができる'catch'句を書くことができます。例えば catch (std::runtime_error& e) からのすべての例外を捕捉します。 std::runtime_error サブツリーからの全ての例外を捕捉し、他の全ての例外を通過させます (そしてコールスタックの更に上を飛行します)。

追伸: (コードの各ポイントで興味のある例外タイプのみをキャッチできるような) 有益な例外クラス階層を設計することは、自明ではない仕事です。標準 C++ ライブラリにあるものは、この言語の作者によって提供された、ひとつの可能なアプローチです。ご覧のように、彼らはすべての例外タイプを「実行時エラー」と「論理エラー」に分割し、そこから独自の例外タイプで処理させることに決定しました。もちろん、この階層を構造化する別の方法もあり、そちらの方が設計に適しているかもしれません。

更新: 移植性 Linux と Windows の比較

Loki Astari と unixman83 が以下の回答やコメントで指摘しているように、このメソッドのコンストラクタは exception クラスのコンストラクタは、C++の標準によると引数を取りません。Microsoft C++ では、引数を取るコンストラクタは exception クラスがありますが、これは標準ではありません。このクラスは runtime_error クラスには引数をとるコンストラクタがあります ( char* ) を取るコンストラクタがあります。ポータブルにするためには runtime_error .

(そして、プロジェクトの仕様にあなたのコードがLinux上で動作する必要がないと書かれているからといって、決してLinux上で動作する必要がないわけではないことを覚えておいてください)