2014-09-15 1 views
-2

저는 C++을 처음 사용하고 있으며 '시도'를 테스트 중입니다. 나는 잡힐해야하는지 예외가 던져 단어 나 구문의 분열을 초래할 수있는 경우 그 자체로 그러나 확실하지 오전 :C++ 어떤 예외를 사용해야합니까?/사용자 입력을 결정하십시오.

예를 들어 :

int current_year = 1; 

//code.... 

cout << "What year is it?\n"; 
cin >> current_year; 

while (n>1) { 

    try{ 
     throw (current_year/current_year); 
    } 
    catch (exception) { 
     cout << "What year is it?\n"; 
     cin >> current_year; 
    } 
    catch (...){ 
     n = 0; 

여기서, CURRENT_YEAR가 정의 될 때 int이고, 사용자가 단어 나 구를 입력하면 "cin < <"을 통해 설정되며 다른 단어 (hense : throw (current_year/current_year);)로 단어를 나눌 때 오류가 발생해야합니다.

그러나 프로그램은 catch (예외) 예외가있는 오류를 catch하지 않습니다. 누군가 내가 사용할 예외를 설명하거나 current_year가 실제로 정수인지 확인하기 위해이 프로그램을 다시 작성하는 방법을 설명해 줄 수 있습니까?

감사합니다.

(다른 하나 : isdigit이 작동하지 않습니다.이 숫자는 -1에서 255까지만 인식하기 때문에 믿을 수 있습니다. 2014를 입력하고 있습니다. 따라서 isdigit을 잘못 사용했다면 나를 알았어.)

+4

'try'는 함수가 아닙니다 ... 또한'int'는'std :: exception' 타입이 아닙니다. 마지막으로, 절대적으로 알고 있어야하는 것보다 더 큰 것을 잡지 마십시오. – Deduplicator

+1

"다른 단어로 단어를 나누는 것"은 무엇을 의미합니까? 사용자 입력의 예를 들어 보겠습니다. 예외를 발생시켜야한다고 생각하는 입력을 입력하십시오. – interjay

+2

이런 종류의 잘못된 입력이 예상되므로 예외를 throw하는 것을 신경 쓰지 않을 것입니다. 사용자에게 입력해야 할 내용을 알려주고 입력을 다시 요청하십시오. – jweyrich

답변

2

유형별 예외가 발생했습니다. 언어가 모든 유형을 허용하지만 일반적으로 std::exception에서 파생 된 것을 던져야합니다.

선택할 수있는 사용자가 많으며 std::invalid_argument은 잘못된 데이터를 입력했을 때 가장 유용합니다.

귀하의 코드는 실제적인 의미가 아닙니다. 예기치 않은 오류가 발생하면 throw해야합니다. 사용자가 잘못 수행 한 텍스트를 기반으로 예외를 만들어야합니다.

current_year가 0으로 입력되지 않는 한 숫자 1을 던집니다 (current_year/current_year은 항상 1이됩니다. 더 많은 문제가있는 경우) 예외 처리기에서 int를 catch해야하고, 어쨌든?

catch(...)을 이상적으로 피하십시오. 함수를 던지기를 정말로해서는 안되는 경우에 때때로 사용됩니다. 당신은 어떤 작업 스레드에 있고 아무것도 잡을 수 없으며 실패한 작업으로 스레드를 죽게하는 것이 더 나을 때 응용 프로그램을 종료하게됩니다.

4

유효한 값의 입력 여부와 상관없이 int 값을 던지고 있습니다. current_year이 0 일 경우 일종의 오류, 즉 정의되지 않은 동작이 발생할 수 있으며 catch 가능한 예외는 아닐 수도 있습니다. 그렇지 않으면 int 값이 항상 1이됩니다. 이는 catch(int) 블록으로 처리 할 수 ​​있습니다. 그러나 그것은 아무 의미가 없을 것입니다. 당신은 사용자가 숫자가 아닌 다른 뭔가를 입력하면 던져하려면

는, 당신은 입력의 결과를 확인 할 수 있습니다 :

if (!(cin >> current_year)) { 
    throw std::runtime_error("Invalid year"); 
} 

runtime_errorexception의 서브 클래스를, 그래서 잡힐 것 exception에 대한 처리기로 처리합니다.

또는 독자적으로 예외 클래스를 정의하고이를 throw 할 수 있습니다. 그것도 서브 클래스가 exception 인 경우에 가장 좋기 때문에 더 구체적인 핸들러가 없으면 적어도 그에 대한 핸들러가 오류 메시지를 추출 할 수 있습니다.

struct InvalidYear : std::runtime_error { 
    InvalidYear() : std::runtime_error("Invalid year") {} 
}; 

if (!(cin >> current_year)) { 
    throw InvalidYear(); 
} 

이 같은이 보일 수 있습니다 뭔가가 InvalidYear, 또는보다 일반적인 핸들러에 대한 특정 핸들러에 의해 runtime_errorexception 적발 할 수 있습니다.

+0

고마워요, 마이크. –

관련 문제