1

以下は、C++ で例外処理を学習する過程で作成したコード スニペットです (Visual Studio 2010 コンパイラを使用)。

#include "stdafx.h"
#include <iostream>
using namespace std;
void multi_double() {

double first,second,product;
try{
cout << "Enter the first number\n";
cin >> first;
cout << "Enter the second number\n";
cin >> second;
product = first * second;
cout << product;
}
catch(...){cout << "Got an exceptional behaviour";}

}
void stud_age(){
int age;
try{
cout << "Enter student's age\n";
cin >> age;
if(age < 0)
    throw;
cout << endl <<age;
}
catch(...) {
    cout << "Caught here\n";
}
}
class Model{
public:
Model(){cout << "ctor\n";}
~Model(){cout << "dtor\n";}
};
int _tmain(int argc, _TCHAR* argv[]) {
//multi_double();
//stud_age();
int a;
try{
    Model obj;
    int *p = NULL;
    *p = 0;//expecting access violation exception

}
catch(...){
    cout << "caught an exception\n";
}
return 0;
}

[C++ 例外を有効にする] が [/EHsc] に設定されています。しかし、アプリケーションを実行すると、とにかくクラッシュします! 次の情報とともに:

問題の署名: 問題イベント名: APPCRASH アプリケーション名: DataTypeConversions.exe アプリケーション バージョン: 0.0.0.0 アプリケーション タイムスタンプ: 4ffd8c3d 障害モジュール名: DataTypeConversions.exe 障害モジュール バージョン: 0.0.0.0 障害モジュール タイムスタンプ: 4ffd8c3d 例外コード: c0000005 例外オフセット: 00001051

コントロールがキャッチブロックに来ないのはなぜ?!

4

2 に答える 2

2

アクセス違反およびその他すべての種類のハードウェア例外は、「C 構造化例外処理 (SEH)」と呼ばれるメカニズムを使用して Windows で処理されます。これはもともと、Posix ベースのシステムの通常の signal()/sigaction() メカニズムよりも、例外を処理するためのより「構造化された」方法を C プログラムに提供するために設計されました。

SEH スタックの巻き戻しが行われる前に呼び出されるトランスレーター関数を設定することにより、SEH 例外をC++ 例外システムに統合できます。新しいトランスレーター関数は単に C++ 例外をスローするだけで、C++ はエラーをキャッチできます!

すべての詳細については、MSDN のこのドキュメントを参照してください。

http://msdn.microsoft.com/de-de/library/5z4bw5h5(v=vs.80).aspx

そして、ここに実際の例があります:

#include <windows.h>
#include <iostream>
#include <eh.h>
// You need to enable the /EHa excpetion model to make this work.
// Go to 
// Project|Properties|C/C++|Code Generation|Enable C++ Exceptions
// and select "Yes with SEH Exceptions (/EHa)"

void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
    // printf( "In trans_func.\n" );
    throw "Hardware exception encountered";
}

int main() 
{
    _set_se_translator(trans_func);
    try
    {
        int *p = NULL;
        *p = 0;//expecting access violation exception
    }
    catch(const char *s)
    {
        std::cout << "caught an exception:" << s << "\n";
    }
    return 0;
}
于 2012-07-11T14:39:14.860 に答える
1

C++ 例外処理システムは、ハードウェア生成 (アクセス違反など) の例外を処理できませんthrow exception;

これらの例外をキャッチしたい場合は、構造化された例外を使用して Windows でのみ可能です。これは他のコンパイラと互換性が__try __exceptなく、通常のtry/ではなく構造を使用しcatchます。

于 2012-07-11T14:28:36.597 に答える