程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++編程異常處置中try和throw和catch語句的用法

C++編程異常處置中try和throw和catch語句的用法

編輯:關於C++

C++編程異常處置中try和throw和catch語句的用法。本站提示廣大學習愛好者:(C++編程異常處置中try和throw和catch語句的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程異常處置中try和throw和catch語句的用法正文


若要在 C++ 中完成異常處置,你可使用 try、throw 和 catch 表達式。
起首,應用 try 塊將能夠激發異常的一個或多個語句關閉起來。
throw 表達式收回旌旗燈號,異常前提(平日是毛病)已在 try 塊中產生。你可使用任何類型的對象作為 throw 表達式的操作數。該對象普通用於轉達有關毛病的信息。年夜多半情形下,建議你應用 std::exception 類或尺度庫中界說的派生類之一。假如個中的類不適合,建議你從 std::exception 派生本身的異常類。
若要處置能夠激發的異常,請在 try 塊以後立刻完成一個或多個 catch 塊。每一個 catch 塊指定它能處置的異常類型。
以下示例將顯示 try 塊及其處置法式。假定 GetNetworkResource() 經由過程收集銜接獲得數據,而且兩個異常類型是從 std::exception 派生的用戶界說的類。請留意,異常由 catch 語句中的 const 援用捕捉。我們建議你經由過程值激發異常並經由過程常數援用將其捕捉。

MyData md;
try {
 // Code that could throw an exception
 md = GetNetworkResource();
}
catch (const networkIOException& e) {
 // Code that executes when an exception of type
 // networkIOException is thrown in the try block
 // ...
 // Log error message in the exception object
 cerr << e.what();
}
catch (const myDataFormatException& e) {
 // Code that handles another exception type
 // ...
 cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
 // ...
 if (IOSuccess == false)
  throw networkIOException("Unable to connect");
 // ...
 if (readError)
  throw myDataFormatException("Format error"); 
 // ...
}

備注
try 子句後的代碼是代碼的受掩護部門。 throw 表達式將激發(即惹起)異常。 catch 子句後的代碼塊是異常處置法式。假如 throw 和 catch 表達式中的類型兼容,該處置法式將捕捉激發的異常。有關治理 catch 塊中類型婚配的規矩的列表,請參閱Catch 塊的盤算方法 (C++)。假如 catch 語句指定省略號 (...) 而非類型,catch 塊將處置每品種型的異常。當你應用 /EHa 選項編譯時,異常可包含 C 構造化異常和體系生成或運用法式生成的異步異常,例如內存掩護、被零除和浮點抵觸。因為 catch 塊按編程次序處置以查找婚配類型,所以盡可能不要應用省略號處置法式來處置聯系關系的 try 塊。請謹嚴應用 catch(...);除非 catch 塊曉得若何處置捕捉的特定異常,不然制止法式持續履行。 catch(...) 塊普通用於在法式停滯履行前記載毛病和履行特別的清算任務。
沒有操作數的 throw 表達式將從新激發以後正在處置的異常。我們建議在從新激發異常時采取該情勢,是由於這將保存原始異常的多態類型信息。此類表達式只應在 catch 處置法式中或從 catch 處置法式挪用的函數中應用。從新激發的異常對象是原始異常對象,而不是正本。

try {
 throw CSomeOtherException();
}
catch(...) {
 // Catch all exceptions – dangerous!!!
 // Respond (perhaps only partially) to the exception, then
 // re-throw to pass the exception to some other handler
 // ...
 throw;
}

Catch 塊的盤算方法 (C++)
固然平日建議您激發派生自 std::exception 的類型,但 C++ 使您可以或許激發任何類型的異常。可以經由過程指定與激發的異常雷同的類型的 catch 處置法式或經由過程可捕捉任何類型的異常的處置法式來捕捉 C++ 異常。
假如激發的異常的類型是類,它還具有基類(或類),則它可由接收異常類型的基類和對異常類型的基的援用的處置法式捕捉。請留意,當異常由援用捕捉時,會將其綁定到現實激發的異常對象;不然,它將為一個正本(與函數的參數年夜致雷同)。
激發異常時,將由以下類型的 catch 處置法式捕捉該異常:

  • 可以接收任何類型的處置法式(應用省略號語法)。
  • 接收與異常對象雷同的類型的處置法式;因為它是正本,是以 const 和 volatile 潤飾符將被疏忽。
  • 接收對與異常對象雷同的類型的援用的處置法式。
  • 接收對與異常對象雷同的類型的 const 或 volatile 情勢的援用的處置法式。
  • 接收與異常對象雷同的類型的基類的處置法式;因為它是正本,是以 const 和 volatile 潤飾符將被疏忽。基類的 catch 處置法式不得位於派生類的 catch 處置法式的後面。
  • 接收對與異常對象雷同的類型的基類的援用的處置法式。
  • 接收與異常對象雷同的類型的基類的 const 或 volatile 情勢的援用的處置法式。
  • 接收可經由過程尺度指針轉換規矩將激發的指針對象轉換為的指針的處置法式。

catch 處置法式湧現的次序是成心義的,由於給定 try 塊的處置法式按它們的湧現次序停止檢討。例如,將基類的處置法式放置在派生類的處置法式的後面是毛病的。 找到一個婚配的 catch 處置法式後,不會檢討後續處置法式。是以,省略號 catch 處置法式必需是其 try 塊的最初一個處置法式。例如:

// ...
try
{
 // ...
}
catch( ... )
{
 // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
 cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
 // Handle CExcptClass exception here.
}

在此示例中,省略號 catch 處置法式是已檢討的獨一處置法式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved