例外処理に関するいくつかの一般的な問題

目次

 

例外処理に関する一般的な問題

例外処理の目的は何ですか?

例外処理の使用方法は?

例外がスローされた場合、実行は下向きに続行されますか?

サンプルコード

運用結果

結果分析

例外がスローされた場合、そのスコープ内のメンバー変数をどのように処理しますか?

コード例

運用結果

結果分析

要約すると、例外処理の実行フローは何ですか?

カスタム例外を渡す方法は?

継承を通じて例外処理をカスタマイズするにはどうすればよいですか?

例外ハンドラーを作成する場合、3つはすべきであり、3つはすべきではありません


例外処理に関する一般的な問題

例外処理の目的は何ですか?

実際、例外処理は、try-catchステートメントと例外処理フラグを使用して実装されます。tryは例外をキャッチするために使用され、catchは例外をキャッチしてそれに応じて処理するために使用されます。異常なステートメントが発生した場合、try-catchを使用して異常な認識を実現できます。たとえば、通常はnewを使用して動的にメモリスペースを申請しますが、アプリケーションスペースが大きすぎてコンピュータのメモリが使用されていない場合はどうなりますか?この種のエラーを正確に特定するために、try-catchステートメントを使用して達成できます。詳細については、「例外処理の使用方法」のルーチンを参照してください。

例外処理の使用方法は?

特定の異常を識別するために使用されます:

#include <exception>  
#include <iostream>  
using namespace std;  
  
int main()  
{  
    try  // 用于识别try{}语句块中的异常并且抛出异常
    {  
        int Size;  
        cin >> Size;  
        int *ArrayPointer = new int[Size];  // 我输入-1,出现bad_alloc异常
        delete[] ArrayPointer;  
    }  
    catch (bad_alloc& exp)  // 被相应的catch语句捕获
    {  
        cout << exp.what() << endl;  
    }  
    catch (exception& exp)  // 用于捕获除bad_alloc之外的异常
    {  
        cout << exp.what() << endl;  
    }  
} 

 

すべての異常を特定すると、上記の手順を簡略化できます。

#include <exception>  
#include <iostream>  
using namespace std;  
  
int main()  
{  
    try  
    {  
        int Size;  
        cin >> Size;  
        int *ArrayPointer = new int[Size];  
        delete[] ArrayPointer;  
    }  
    catch (exception& exp)  
    {  
        cout << exp.what() << endl;  
    }  
}  

 

例外がスローされた場合、実行は下向きに続行されますか?

サンプルコード

#include <exception>  
#include <iostream>  
using namespace std;  
  
int main()  
{  
    try // 用于识别try{}语句块中的所有异常并且抛出异常  
    {  
        int Size;  
        cin >> Size;  
        int *ArrayPointer = new int[Size];  
        cout << "正在继续执行" << endl; // 不会继续向下执行,直接由catch捕获异常然后执行处理程序  
        delete[] ArrayPointer;  
    }  
    catch (bad_alloc& exp) // 用于捕获bad_alloc特定异常  
    {  
        cout << exp.what() << endl;  
    }  
    catch (exception& exp) // 用于捕获除bad_alloc之外的其他所有异常  
    {  
        cout << exp.what() << endl;  
    }  
} 

 

運用結果

 

結果分析

結果から、例外がスローされると、catchによってキャッチされ、catch例外ハンドラーで実行されることがわかります。

例外がスローされた場合、そのスコープ内のメンバー変数をどのように処理しますか?

コード例

#include <exception>  
#include <iostream>  
using namespace std;  
  
struct Mumber_A   
{  
    Mumber_A()  
    {  
        cout << "调用构造函数" << endl;  
    }  
    ~Mumber_A()  
    {  
        cout << "调用析构函数" << endl;  
    }  
};  
  
void ExceptionShow()  
{  
    Mumber_A Obj_A;  
    throw "出现异常";  
}  
  
int main()  
{  
    try  
    {  
        ExceptionShow();  
    }  
    catch (const char* Obj)  
    {  
        cout << "异常处理" << endl;  
    }  
    cout << "主程序结束" << endl;  
}  

 

運用結果

 

結果分析

実行結果から、try {}ステートメントブロックが例外をスローした場合、最初に行うことは、try {}ステートメントブロック内のすべてのオブジェクトを分解してから、catchにジャンプして例外ハンドラーを実行することがわかります。

結果から、例外がスローされると、すぐにcatchによってキャッチされ、catch例外ハンドラーに入ります。

要約すると、例外処理の実行フローは何ですか?

 

カスタム例外を渡す方法は?

#include <iostream>  
#include <exception>  
using namespace std;  
  
void ExceptionShow1()  
{  
    throw "抛出异常";  
}  
  
void ExceptionShow2()  
{  
    ExceptionShow1();  
    throw; // 继续抛出异常  
}  
  
int main()  
{  
    try  
    {  
        ExceptionShow2 ();  
    }  
    catch (const char* exp)  // 捕捉ExceptionShow2抛出的异常
    {  
        cout << "异常处理程序" << endl;  
    }  
}  

 

継承を通じて例外処理をカスタマイズするにはどうすればよいですか?

#include <iostream>  
#include <exception>  
#include <string>  
using namespace std;  
  
class CustomException : public exception  
{  
private:  
    string reason;  
public:  
    CustomException(string reason)  
    {  
        this->reason = reason;  
    }  
    ~CustomException()  
    {  
        cout << "调用CustomException的析构函数" << endl;  
    }  
    virtual const char* what() const noexcept // throw()与noexcept等价,表明:在这个函数作用域内不可以抛出任何异常  
    {  
        return reason.c_str(); // 重载虚函数时,子类与父类各方面都必须一样  
    }  
};  
double Division(double divisor,double dividend)  
{  
    if (dividend == 0)  
    {  
        throw CustomException("除数为零");  
    }  
    return divisor / dividend;  
}  
  
int main()  
{  
    try  
    {  
        cout << "结果为" << Division(8, 0) << endl;  
    }  
    catch (exception& exp)  // 一定要用引用
    {  
        cout << exp.what() << endl;  
    }  
}  

例外処理をカスタマイズする最良の方法は、例外を継承することです。これにより、例外のすべての例外フラグの再利用に基づいてカスタム例外フラグを確実に追加できるためです。

カスタム例外処理の利点は何ですか?

もちろん、これは必須ではありませんが、std :: exception例外をキャッチするすべてのcatch()ブロックを再利用できます。独自の例外クラスを作成する場合、クラスを継承することはできませんが、関連するすべての場所に新しいcatch(MyNewExceptionType&)ステートメントを挿入する必要があります。

例外ハンドラーを作成する場合、3つはすべきであり、3つはすべきではありません

 

おすすめ

転載: blog.csdn.net/weixin_45590473/article/details/108307581