2011-09-14 252 views
0

對不起,我之前沒有提供代碼,由於縮進。現在,我正在提供代碼。正如我前面提到的,我在示例代碼中拋出了一個異常,並且我仍然有一個由代碼返回的0。我花了一些時間試圖弄清楚,但我無法得出確切的答案。異常處理

#include <stdexcept> 
#include <iostream> 
#include <string> 

using namespace std; 


class myException_Product_Not_Found: public exception 
{ 
    public: 
     virtual const char* what() const throw() 
    { 
     return "Product not found"; 
    } 

} myExcept_Prod_Not_Found; 

int getProductID(int ids[], string names[], int numProducts, string target) 
{ 

    for(int i=0; i<numProducts; i++) 
    { 
     if(names[i]==target) 
     return ids[i];   
    } 
    try 
    { 
    throw myExcept_Prod_Not_Found;  
    } 
    catch (exception& e) 
    { 
    cout<<e.what()<<endl;  
    }           
} 

int main() //sample code to test the getProductID function 
{ 
    int productIds[]={4,5,8,10,13}; 
    string products[]={"computer","flash drive","mouse","printer","camera"}; 
    cout<<getProductID(productIds, products, 5, "computer")<<endl; 
    cout<<getProductID(productIds, products, 5, "laptop")<<endl; 
    cout<<getProductID(productIds, products, 5, "printer")<<endl; 
    return 0; 
} 

C++異常

+0

[提供的示例代碼可能會重複一個隨機數,即使拋出異常(代碼提供)](http://stackoverflow.com/questions/7420793/the-sample-code-provided-返回一個隨機數,甚至拋出後,一個抗體) – amit

+0

夥計,跆拳道。你已經問過這個。 –

回答

2
try 
{ 
throw myExcept_Prod_Not_Found;  
} 
catch (exception& e) 
{ 
cout<<e.what()<<endl;  
} 

您捕捉異常,本質上說,您與印cout的消息處理它。

這將重新拋出異常,如果你想傳播它。

try 
{ 
throw myExcept_Prod_Not_Found;  
} 
catch (exception& e) 
{ 
cout<<e.what()<<endl;  
throw; 
} 

如果您想在傳播後不從主函數返回0,則必須自己做。

int main() 
{ 
    try { 
    // ... 
    } catch (...) { 
    return 1; 
    } 
    return 0; 
} 
+0

嗨,湯姆,添加「扔」後,我得到了我想要的,但是,我也收到了錯誤消息。下面是我得到的消息:「該應用程序已經請求運行時以不尋常的方式終止它,請聯繫應用程序的支持團隊獲取更多信息。」 – T3000

+0

@ T3000這是預期的行爲。 Windows只是告訴你(應用程序的用戶)程序員(也恰好是你)以某種方式搞砸了。我不知道你想如何處理它,但我會猜測並更新我的帖子。 –

0

您的getProductID()函數不會從所有可能的執行路徑中返回。所以當函數退出而沒有return聲明時,你會得到隨機垃圾。產品字符串未找到時就是這種情況。

您的try/catch塊是一個紅色鯡魚,因爲它不會以任何方式影響代碼的其餘部分(異常立即被捕獲)。改進

兩個不相關的提示:

  1. 捕獲例外被不斷引用。

  2. 使用std::find而不是您的手動循環;這樣,您可以將整個函數體寫入兩行。

  3. 不要使用C風格的數組;相反,使用std::vector

+0

我甚至嘗試過使用一個布爾值,如果目標已經找到,布爾值的值爲true,否則爲false。然後,我檢查布爾值的值,如果它是假的(一旦我們離開循環)然後嘗試/ catch。但它並沒有帶我到任何地方。 – T3000

+0

@ T3000 - 這有什麼關係? –

+0

好吧,我會嘗試你的建議來改善我的代碼。謝謝! – T3000