2011-09-26 7 views
1

C++에서 대기열 구현을 시도하고 있습니다. 그 동안 나는이 문제를 겪고있다. 나는이 문제를 내가 catch 블록 try 블록 아래에 기록되지 않기 때문에 발생 생각C++의 try-catch 문제

error: expected ‘catch’ before ‘i’

:

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++; 
} 
} 

는이 같은 오류를 제공합니다. 그러나 main()에서 catch 블록을 작성하려면 (이 경우처럼) 어떻게 할 수 있습니까?

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

+1

질문과는 관계가 없지만 queue [i]가 i를 증가시키지 않는 한 while 루프는 영원히 계속 실행됩니다 (이는 거의 없습니다). –

+0

나는 첫 번째로 대답하려고했으나 :)이 멀티 코어 사용자는 .. –

+0

또 다른 질문은 왜 'try' 블록을 추가 했는가하는 것입니다. 예외를 던질 것으로 예상했기 때문에 'catch'가 누락 된 것이 분명해 보입니다. 그러나 나는 여러분이 try catch 구문이 무엇인지에 대해 잘 모르는 느낌을받습니다.이 경우에 당신이 여기를보고 싶어 할 수도 있습니다 : http://www.cplusplus.com/doc/tutorial/exceptions/ –

답변

7

catch 블록은 try 블록을 따라야합니다. catchmain에 넣으려면 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

하는 모든 블록이 하나 개 이상의 관련된 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 블록을 제거하기 만하면됩니다. 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]<<" "; 
} 

그런 다음 maintry/catch 구조를 포함 할 수 있습니다.

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

캐치 시도 후 즉시해야합니다. 이것들이 규칙입니다.