[解決済み] std::runtime_error と std::exception() の違い。
疑問点
とはどのような違いがあるのでしょうか?
std::runtime_error
と
std::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上で動作する必要がないわけではないことを覚えておいてください)
関連
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較