通常のデバッグによって生成される例外 (図に示すように) と、ユーザー入力が正しいかどうかを人為的に判断しようとする try throw 例外の間に本質的な違いはありますか? C について話すときのメカニズムには前者が含まれますか? それとも単に後者のことを指しますか?
上記の最初の例外は何によって判断されますか?たとえば、図の accedd 違反は、コンパイラまたは IDE の他のツールによって判断されますか?
phpcn_u15822017-06-30 09:59:21
@Evian おっしゃることはもっともです、補足させてください
C++ の例外は、C++ によってスローされた例外のみをキャッチできます。簡単に言うと、それ自体によってスローされた例外のみをキャッチできます (作成したコードに限らず、ランタイム ライブラリも同様)。
実際、C++ によってスローされる例外は、単に定義され、予測可能なものであるため、実際の例外ではありません。実際の例外は、実行後に CPU によってのみトリガーされます。つまり、ハードウェアによってスローされた例外です。
ハードウェアは C++ を直接考慮せず、その処理はオペレーティング システムに任せられます。オペレーティング システムが異なると、例外処理にも一貫性がありませんが、例外処理は上位レベルの言語に渡されません。
比較的完全な Windows 例外処理を例に挙げると、次のようになります
デバッガに任せる(プロセスをデバッグする必要がある)
VEHを実行
SEHを実行
TopLevelEH (プロセスはデバッグ時に実行されません)
デバッガに任せる(上記の例外処理では処理できないとのことでしたので、再度デバッガに渡しました)
呼び出し例外ポート通知 csrss.exe
曾经蜡笔没有小新2017-06-30 09:59:21
メモリ読み取り違反はハードウェアによって判断され、処理のためにオペレーティング システムに渡されます。 (C++ についてはあまり詳しくありませんが、これは C++ の例外のようなものではなく、Windows によってスローされる例外です。)
怪我咯2017-06-30 09:59:21
あなたの言いたいことは理解できませんでした。一部のライブラリには例外クラスが組み込まれていますが、結局のところ、それらはすべて std::exception
から継承しています。また、これは実行時例外であり、コンパイラや IDE とは関係ありません。