2017-05-23 2 views
0

오류 처리에 관한 한 가지 의심이 있습니다 ...다른 함수 내부에서 호출 된 함수에서 예외가 throw되면 어떻게됩니까?

함수가 예외를 throw하고 주 프로그램에서 예외가 발견되지 않으면 잘못 작동합니다.

내 질문에 왜이 프로그램이 충돌하지 않습니까? Test에서 예외가 throw 된 경우 함수 enterNumber이 잡히지 않았는데도 예외가 발생합니다.

예외를 throw 할 수있는 모든 함수가 예외를 throw하는 경우를 제외하고 try-catch 블록에 넣지 않아야합니까?

2 °

void Test(int number) { 
    if(number < 0) 
     throw std::domain_error("Number is negative"); 
} 

int enterNumber() { 
    int number; 
    std::cout << "Enter a number: "; 
    std::cin >> number; 
    try { 
     Test(number); 
    } 
    catch(...) { 
     throw; 
    } 
    return number; 
} 

int main() { 
    try { 
     int number = enterNumber(); 
     std::cout << "Entered number: " << number; 
    } 
    catch(std::domain_error e) { 
     std::cout << e.what(); 
    } 
    return 0; 
} 

누군가가 기능 enterNumberTest가 발생하는 경우에 예외를 throw하는 방법을 설명 할 수있는 경우 :

#include <iostream> 
    #include <stdexcept> 

    void Test(int number) { 
     if(number < 0) 
      throw std::domain_error("Number is negative"); 
    } 

    int enterNumber() { 
     int number; 
     std::cout << "Enter a number: "; 
     std::cin >> number; 
     Test(number);   
     return number; 
    } 

    int main() { 
     try { 
      int number = enterNumber(); 
      std::cout << "Entered number: " << number; 
     } 
     catch(std::domain_error e) { 
      std::cout << e.what(); 
     } 
     return 0; 
    } 

1 ° 나는이 다음과 같이 작성해야한다고 생각 그것? (경우 1 °)

당신 : 당신은 예외를 발생시킨 함수를 호출 한 함수에서 예외를 잡을 필요가 없습니다

+1

C++로 설계된대로 작동합니다. 캐치되지 않은 함수는 스택을 버블합니다. –

+1

예외는 함수에서 버블 업 (bubble up) 할 수 있습니다. 그것은 한 번 거품의 메인에서 문제입니다. 당신이 메인에서 버블 링하지 않으면 당신은 괜찮습니다. – NathanOliver

+1

귀하의'시도 { 시험 (번호); } catch (...) { throw;'구조가 완전히 무의미합니다. 모든 예외를 잡아서 즉시 다시 던지기 만하면됩니다. 단지'try' /'catch'를 제거한 경우와 동일합니다. –

답변

1

감사드립니다. 사실 가장 좋은 방법은 예외가 발생한 곳에서 예외를 잡아내는 것입니다 (프로그램의 상위 수준에서만 의미있는 오류 메시지를 생성하기에 충분한 정보가 있음). 그리고/또는 다른 방법으로 예외를 처리 할 수 ​​있습니다. 그러나 예외는 프로그램의 일부 레벨에 걸리거나 프로그램이 제어되지 않은 방식으로 종료됩니다.

+0

몇 가지 예외 사항으로, 메인을 벗어나 프로그램을 다운시키는 것은 완벽 할 수 있습니다. 때로는 깨진 세계에서 복구하고 잠재적으로 더 많은 위험을 초래하는 것보다 충돌 (나중에 디버깅을위한 핵심 작성)하는 것이 좋습니다. –

+1

* "예외가 발생한 곳에서 예외를 가능한 한 많이 잡아내는 것이 가장 좋습니다."* 이것은 나에게 맞는 것 같지 않습니다. 즉, '메인'또는 스레드의 주요 기능을 잡는 것이 가장 좋은 방법임을 의미합니다 예외를 잡으려고. 아마도 "모범 사례"와 같은 것은 예외에 대해 뭔가를 할 수있는 곳에서만 예외를 잡는 것입니다. –

+0

@ François "가능한 한 멀리"말했습니다 - 메인에있는 모든 것을 잡아서 다루는 것이 종종 가능하지 않습니다. 나는 그 대답을 약간 어루 만았다. –

관련 문제