2012-01-24 35 views
2

我是編程新手,遇到try/catch子句時遇到問題。C++ try/catch(編程的新內容,關於此子句的信息不多)

這裏是一本教科書,我有一個例子:

int main() 
{ 
    char *ptr; 

    try { 
     ptr = new char[ 1000000000 ]; 
    } 

    catch(…) { 
     cout << "Too many elements" << endl; 
    } 

    return 0; 
} 

我曾試着在網上找了進一步的解釋和教科書沒有確切地告訴我它是什麼,這些條款實際上做什麼或用於。

任何信息都會有幫助。

編輯:我使用的教材是: C++:類和數據結構由傑弗裏·蔡爾茲

+0

這是C++ [異常處理](http://www.parashift.com/c++-faq-lite/exceptions.html)。另一個鏈接是在這裏:http://msdn.microsoft.com/en-us/library/6dekhbbc.aspx – birryree

+3

這是一個很多方面的可怕的例子。洗你的眼睛,然後閱讀文檔。 – bmargulies

+1

FWIW如果您不熟悉C++,那麼我不會介入異常處理和異常 – AJG85

回答

0

嘗試捕捉是異常處理的方式:

try 
{ 
     // Do work in here 
     // If any exceptions are generated then the code in here is stopped. 
     // and a jump is made to the catch block. 
     // to see if the exception can be handled. 

     // An exception is generated when somebody uses throw. 
     // Either you or one of the functions you call. 

     // In your case new can throw std::bad_alloc 
     // Which is derived from std::runtime_error which is derived from std::exception 

} 
// CATCH BLOCK HERE. 

catch塊中,可以定義要處理什麼異常。

// CATCH BLOCK 
catch(MyException const& e) 
{ 
    // Correct a MyException 
} 
catch(std::exception const& e) 
{ 
    // Correct a std::exception 
    // For example this would cat any exception derived from std::exception 
} 

你可以有任意數量的catch塊,只要你喜歡。如果你的異常與catch語句中的任何catch語句匹配,那麼將執行相關的代碼塊。如果沒有catch表達式匹配一個異常,那麼堆棧將被展開,直到它找到一個更高級別的catch塊並且進程被重複(如果沒有找到匹配的catch塊,這可能導致應用程序退出)。

注意:如果多個catch表達式匹配,則使用詞法上的第一個。只有一個或沒有任何catch塊會被執行。如果沒有,那麼編譯器會尋找更高級別的try/catch。

還有一個catch子句的任何

catch(...) 
{ 
    // This is a catch all. 
    // If the exception is not listed above this will catch any exception. 
} 

那麼這是如何應用到你的代碼。

int main() 
{ 
    char *ptr; 

    try 
    { 
     // This calls ::new() which can potentially throw std::bad_alloc 
     // If this happens then it will look for a catch block. 
     ptr = new char[ 1000000000 ]; 


    // If the ::new() works then nothing happens and you pointer `ptr` 
    // is valid and code continues to execute. 
    } 
    catch(…) 
    { 
     // You only have one catch block that catches everything. 
     // So if there are any statements that generate an exception this will catch 
     // the excetption and execute this code. 

     cout << "Too many elements" << endl; 
    } 
    // As you have caught all exceptions the code will continue from here. 
    // Either after the try block finishes successfully or 
    // After an exception has been handled by the catch block. 

    return 0; 
} 
+0

這對我來說是一個非常好的解釋。感謝您向我展示它與提供給我的蹩腳示例的關係。 –

2

一個try-catch代碼是C++構建異常處理。 Google'C++例外'。

-1

Try-catch塊用於捕獲代碼中的錯誤。

在最基本的級別上,由於程序試圖執行無效指令而發生錯誤。該指令(閱讀:代碼行)可能因多種原因無效。在您的特定實例中,如果您的程序無法分配1,000,000,000個字節的內存來描述您的ptr,則該指令可能無效。最常見的例外情況是嘗試訪問一個錯誤的指針,該指針稱爲空指針異常,當您嘗試對尚未創建或已被刪除(或已損壞)的對象執行某些操作時會發生這種情況。你會學會討厭這個例外。

如果try塊內的代碼發生任何錯誤,使用catch(...)將通知程序執行catch塊內部的代碼。在那裏,你可以處理你的錯誤,並試圖找到解決錯誤條件或正常退出該模塊。

您還可以捕獲特定的錯誤,你可以找到更多關於這裏:http://www.cplusplus.com/doc/tutorial/exceptions/

+1

C++中沒有「空指針異常」。 –

+0

這是一個很差的解釋,幾乎忽略了有關C++異常的所有觀點。他們肯定不會「陷入錯誤」。 –

+0

我認爲這給出了一個體面的異常和try/catch塊的概述,即使細節不確定。 –

-5

如果你已經知道C,try/catch達到同樣的事情setjmp/longjmp用於錯誤處理時。將try認爲是setjmp的if條件的代碼和setjmp的其他代碼的catch代碼。這使得C++中的longjmp等效於throw,用於引發異常。在你的例子中,可能是內部調用某個內存分配函數的new操作符在使用C++ throw操作符查看一個非常大的數字作爲輸入時會引發異常。

void a() 
{ 
     ....... 
     longjmp(buf,1);  // <--- similar to throw 
     ....... 
} 

if (!setjmp(buf))  // <--- similar to try 
{ 
     ....... 
     a(); 
     .......     
} 
else      // <--- similar to catch 
{      
     .......   
} 

try/catchsetjmp/longjmp更復雜一點,爲setjmp/longjmp,您將需要聲明這是setjmp/longjmp電話揮發性,這是沒有必要的try/catch之間修改變量。

+0

編程新手可能不熟悉'setjmp/longjmp'。 –

+0

setjmp/longjmp對不用於實現異常。時間刷新你的知識:) – 2012-01-24 18:21:51

+0

Vlad Lazerenko - 誰說setjmp/longjmp不能用於異常處理。如果維基百科的文章這樣說,那麼它確實用於它。事實上,Microsoft C編譯器中的舊__try和__catch宏可能使用了setjmp/longjmp。 – MetallicPriest