2011-09-26 87 views
1

我正在嘗試C++中的隊列實現。在那期間,我遇到了這個問題。C++中的Try-Catch問題

void Queue::view() 
{ 
int i; 
try 
{ 
    if(Qstatus==EMPTY) 
    { 
    UnderFlowException ex = UnderFlowException("\nQUEUE IS EMPTY"); 
    throw ex; 
    } 
} 

i=front; 
cout<<"Queue contains...\n"; 

while(i <= rear) 
{ 
    cout<<queue[i]<<" "; 
    i++; 
} 
} 

這給了一個錯誤:

error: expected ‘catch’ before ‘i’

我覺得這個問題是出現,因爲我不寫catch塊以下try塊。 但是如果想在main()中寫入catch塊(就像這種情況),我怎麼能這樣做呢?

Before, that Could I do that? If not Why?

+1

與問題無關,但你的while循環將永遠運行,除非queue [i]增加i(這不太可能)。 –

+0

我正要在第一時間回答這個問題:)但這些多核心用戶...... –

+0

另一個問題可能是你爲什麼添加'try'塊?如果這是因爲你預計會拋出一個異常,似乎很明顯'catch'丟失了。但是我感覺你並不完全知道try catch語句是什麼,如果這是你可能想要看的情況:http://www.cplusplus.com/doc/tutorial/exceptions/ –

回答

7

catch塊必須遵循try塊。如果您希望catch位於main - 那就是try也必須是。你可以在任何地方使用throw,不必在同一個函數內的try塊內。

應該是這樣的:

void Queue::view() 
{ 
int i; 
if(Qstatus==EMPTY) 
{ 
    UnderFlowException ex = UnderFlowException("\nQUEUE IS EMPTY"); 
    throw ex; 
} 

i=front; 
cout<<"Queue contains...\n"; 

while(i <= rear) 
    cout<<queue[i]<<" "; 
} 
/// ... 
int main() 
{ 
    Queue q; 
    try{ 
     q.view(); 
    } 
    catch(UnderFlowException ex) 
    { 
     /// handle 
    } 
    catch (...) 
    { 
    /// unexpected exceptions 
    } 
    // follow the success/handled errors 
} 
+1

'int main(void)'? –

1

所有try塊至少需要一個相關的catch塊。如果您無意在此處理任何異常,則應該移除try塊。例外可以是(通常應該是!)在try塊之外拋出。

0

使您的代碼捕獲並重新拋出異常,如:

try 
{ 
if(Qstatus==EMPTY) 
{ 
    UnderFlowException ex = UnderFlowException("\nQUEUE IS EMPTY"); 
    throw ex; 
} 
} catch(...) { 
    throw; // rethrow whatever exception we just catched 
} 

雖然你甚至都不需要擺在首位的try塊。看起來只是throw ex;會工作,因爲你不打算抓住它,但只是扔它。

+1

抓不到,爲什麼趕上第一位? –

+2

這個try-catch代碼是膨脹的,並且不會做任何事情,但可能會減慢程序的速度。刪除try塊是更好的解決方案。 –

+1

@David Heffernan:那是**他怎麼能做到這一點,雖然似乎沒有做到這一點。 –

3

您只需要刪除try塊。 A try塊總是以catch

void Queue::view() 
{ 
    int i; 
    if(Qstatus==EMPTY) 
    { 
     ex = UnderFlowException("\nQUEUE IS EMPTY"); 
     throw ex; 
    } 

    i=front; 
    cout<<"Queue contains...\n"; 

    while(i <= rear) 
     cout<<queue[i]<<" "; 
} 

然後,您可以在您main一個try/catch結構。嘗試後

int main() 
{ 
    Queue queue; 
    try 
    { 
     queue.View() 
    } 
    catch(UnderFlowException ex) 
    { 
     //handle ex 
    } 
    return 0; 
} 
0
try{ 
} 
catch(Exception ex){ 
} 

捕撈必須立即。這些是規則。