2017-05-17 79 views
0

我有幾個問題。首先,我會給一些僞代碼,我想用這個東西。嘗試,拋出,捕捉函數

Im做一些功課(實現銀行),我有一個功能

void MoneyMarketing_Account::Transaction_menu() 
{ 
    int choice, value; 
    string login, password; 
    cout << "Enter name and pas for account "; 
    cin >> login, password; 
    cout << "Choose valute and amount" << endl 
    << "1 Grn  [amount]" << endl 
    << "2 Dollars [amount]" << endl 
    << "3 Euro [amount]" << endl 
    << "4 Forint [amount]" << endl 
    << "5 Rub  [amount]" << endl; 
    cin >> choice; 
    cin >> value; 
if(choice == 1) 
    throw(Request_t(login, password, "Grn", value)); 
if(choice == 2) 
    throw(Request_t(login, password, "Dollars", value)); 
if (choice == 3) 
    throw(Request_t(login, password, "Euro", value)); 
if (choice == 4) 
    throw(Request_t(login, password, "Forint", value)); 
if (choice == 5) 
    throw(Request_t(login, password, "Rub", value)); 

struct Request_t { 
    string login; 
    string password; 
    string type; 
    int amount; 
    Request_t(string login_, string password_, string type_, int amount_) { 
    login = login_; 
    password = password_; 
    type = type_; 
    amount = amount_; 
}}; 

第一個問題是 - 我可以使用throw語句沒有try塊。 第二個就是這個地方會去的地方。例如

void foo() 
{ 
    Transaction_menu(); //function that i have shown before 
    Transaction_catch();//function that is supposed to catch request 
} 

因此,這是第一個函數將被稱爲第二個輸入?

+2

它看起來像你誤會例外。例外情況不適用於正常流量控制,而是處理「特殊」情況。在這種情況下,它看起來應該'返回'Request_t'? – crashmstr

回答

3

我可以使用throw語句沒有try塊

是。您的foo()功能是完全有效的,但...

...這是第一個函數調用第一個函數嗎?

號如果foo()電話Transaction_menu()在你表現出的方​​式,那麼當Transaction_menu()拋出異常,也會造成foo()立即扔一樣。

如果你想趕上例外,你必須做它像這樣:

void foo() 
{ 
    try { 
     Transaction_menu(); 
    } catch (Request_t &request) { 
     ...code that goes here will run ONLY if a Request_t is thrown,... 
     ...and request will be a reference to the thrown object... 
    } 
} 

P.S; 「Request_t」對於您打算使用的數據類型來說是一個有趣的名稱throw。通常拋出的類型的名稱如TransactionException

P.P.S .;拋出一個例外,因爲而不是,這是一個非常規的錯誤。這會讓其他程序員難以閱讀和理解你的代碼,因爲它完全違背了他們的期望。

此外,throwreturn,更昂貴,因此在性能至關重要的應用程序中,這是除了錯誤之外不會因其他原因而拋出的另一個原因。

+0

好吧,我這樣稱呼它,因爲它現在是錯誤) – PAPAmidNIGHT

+0

以及耐心解釋) – PAPAmidNIGHT

+1

請參閱下面的@πάντα-ῥεῖ答案。這一點很重要。 – Donnie

2

要在@james answer增加(這在技術上是正確的):

永遠不要使用異常實現代碼中的控制流。
它們用於特殊情況和錯誤情況,這些情況無法在引發它們的代碼片段中涉及。

你更想要的是你的情況下,一個簡單的返回值:

Request_t MoneyMarketing_Account::Transaction_menu() 
{ 
// ... 
if(choice == 1) 
    return Request_t(login, password, "Grn", value); 
if(choice == 2) 
    return Request_t(login, password, "Dollars", value); 
if (choice == 3) 
    return Request_t(login, password, "Euro", value); 
if (choice == 4) 
    return Request_t(login, password, "Forint", value); 
if (choice == 5) 
    return Request_t(login, password, "Rub", value); 

throw std::runtime_error("Invalid choice"); 
}