C++:11.異常操作

C++ 的異常操作

1.、異常涉及的關鍵字有哪些? 

  • throw   拋出異常  。
  • try        中包含的是可能出現異常的語句,後面可以跟多個catch。
  • catch    用於捕獲異常後面括號中跟的是異常的類型,其中包含的是處理方法。

解釋一下重拋異常:當catch捕獲到一個異常,可以在這個catch中再次throw拋出異常,但這個throw後面可以不跟內容,表示繼續拋出原來的異常。(注:我沒理解你拋得都是一樣的,catch是按異常類型捕獲的,這個重拋的意義在哪裏?)

在C++中異常是可以不處理的,但在java等其他語言中中異常是一定要處理的。

再來說一下:在try中定義有很多異常,如果有一個異常先出來,後面的釋放就不執行了,如何處理:智能指針。

try
{
	//int *p1 = new int;    
	//int *p2 = new int;
	//int *p3 = new int;   假設p3拋出了異常,地下的delete就不執行了,直接跳到catch裏了。
	//int *p4 = new int;

	unique_ptr<int> ptr1(new int);
	unique_ptr<int> ptr2(new int);
	unique_ptr<int> ptr3(new int);
	unique_ptr<int> ptr4(new int);

	//delete p1;
	//delete p2;
	//delete p3;
	//delete p4;
}
catch (const bad_alloc& e)
{
		
}

2. 你碰見過哪些異常?

new int();

3. 異常的棧展開是怎麼回事?

函數拋出的異常會沿着函數調用鏈逆向拋出,如果到系統,系統調用terminate()終止整個程序。

舉個例子,解釋一下:

函數中有個調用鏈,main ->  A -> B -> C   如果C拋出異常,先在C函數棧幀中找處理該異常的程序。如果沒找到,回到B中找,找到了再返回C繼續執行。如果main都沒有,再拋給系統,系統調用terminate()。

4、構造函數和析構函數是否可以拋出異常?

語法上來說都是可以的。但是!!!

構造函數拋出異常,對象沒有構造成功,對象都沒有,又怎麼會調用析構函數。處理方法是:如果在構造函數中要拋出異常,則在拋出前要記得刪除申請的資源。或者直接使用智能指針即可。

析構函數也不能拋出異常,處理析構函數異常的正確方式是將異常封裝在析構函數內部,而不是拋出異常,如下代碼所示。

~ClassName()
{
    try
    {
        do_something();
    }
    catch
    {
        //...
    }
}

原因如下:C++異常處理模型有責任處理那些因爲出現異常而失效的對象,處理方式是調用這些失效對象的析構函數,釋放掉它們佔用的資源。如果析構函數再拋出異常,則會陷入無盡遞歸嵌套之中,因此這是不被允許的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章