2013-07-16 3 views
2

OK doProcess()라는 함수가 있는데이 함수 내부에서 발생할 수있는 예외를 catch하고 싶습니다. 언젠가 함수 나 외부에서 예외를 잡으려고하면 어떤 차이가 있다는 것을 알게되어서 혼란 스럽습니다. 어떤 차이점이 있으며 어떤 방법이 더 좋습니까? Win 7에서 VS C++ 2010을 사용하고 있습니다. 고마워요. 함수 내부 잡기 두 가지 방법으로 예외를 잡으십시오.

..

void doProcess() 
{ 
    try{ 
     for(int i=0; i<n; i++) 
     { 
     Performcalculations(); 
     . 
     . 
     . 
     } 
     performanotherProcess(); 
     . 
     . 
    } 
    catch(exception e) { 
     cout<<e.what()<<endl; 
    } 

}

콜백 함수 외부 잡기.

void callback() 
{ 
    try{ 
     doProcess(); 
    } 
    catch(exception e) { 
     cout<<e.what()<<endl; 
    } 
} 
+0

'<< cout' 이것은 무엇입니까? –

+0

'doProcess'에서 예외를 처리 할 수 ​​있다면 그렇게하십시오. – andre

+0

@ Ryan Haining, 이것은 사람의 실수입니다. ;) 내 실수. 수정 됨. – furqan

답변

4

예외를 가장 잘 처리 할 수있는 레벨에 따라 다릅니다. 경우에 따라 하위 수준에서이를 catch하고 예외 처리 작업을 수행 한 다음 다시 던져 상위 수준에서 다시 catch하여 더 이상 처리 할 수도 있습니다.

예외 처리에는 예외가 발생하지 않으면 수행되지 않는 특수한 작업이 포함될 수 있습니다. 예는 다음과 같습니다

  • 자원을 정리 경고 또는 오류 메시지
  • 로깅 매개 변수와 수정
  • 를 다시 던지기 전에 예외 객체에 정보를 추가
  • 실패 기능을 실행하기 위해 재 시도

하위 수준 기능에서는 이러한 각 동작을 수행 할 수 없습니다. 예를 들어, 저수준에서는 로거를 사용할 수 없거나 정리해야 할 특정 리소스에 액세스 할 수없는 경우가 있습니다. 이 경우 예외를 던지거나 포기하고 다시 던져서 상위 레벨에서 잡아야합니다.

모두 예외를 처리하는 데 필요한 리소스에 액세스 할 수있는 수준에 따라 다릅니다. 여러 번 잡아서 다시 던지거나 다른 예외 유형으로 잡아서 다시 던지기도 완벽하게 가능하며 때로는 옳은 일입니다.

catch (my_exception &e) 
{ /*...*/ } 

이유는 다음과 같습니다 : a) 귀하는 복사, b) 귀하 혜택을 저장


나는 또한 오히려 복사본보다, 참조 예외를 잡기 위해 일반적으로 좋은 생각이라고한다 (예외가 종종 예외 유형의 유형 계층 구조의 일부이기 때문에) c) 자연스럽게 원래 예외 객체의 멤버 함수를 호출하거나 캐치 한 각 레벨에서 정보를 추가 할 수 있습니다. 던져. 정보를 추가하지 않고 간단히 잡아서 (그리고 아마도 다시 던지기) const이라는 참조를 붙이는 것도 가능합니다.

+0

일반적으로 순수 참조가 아닌 * const 참조 *로 전달합니다. – Rapptz

+0

@Rapptz 의견이 이에 따라 나뉘며, 의견에서 논의 된 다른 질문이 있습니다. 나는 더 나은 것에 대한 논쟁을 가지지 않을 것이다. 어쨌든 부정확하거나 극도로 위험한 것은 아닙니다. – jogojapan

+0

@DyP 감사합니다. 좋은 지적이고 답에 추가되었습니다. – jogojapan

1

doProcess()가 expection 핸들을 원하면 doProcess()에 try {} catch() {}를 써야하지만 doProcess()가 expection, 그럼 던지기 만하면됩니다. 코드 및 디자인에 따라 다릅니다.

관련 문제