2012-10-13 7 views
1

내 연결된 목록이 비어 있지만 EmptyListException()을 주석 처리하지 않으면 프로그램이 종료를 계속할 때 EmptyListException을 발생 시키려고합니다. 이 내 EmptyListException 헤더C++ 예외 잡히지 않았습니다

#ifndef EMPTYLISTEXCEPTION_H 
#define EMPTYLISTEXCEPTION_H 

#include <stdexcept> 
using std::out_of_range; 
class EmptyListException : public out_of_range 
{ 
    public: 
     EmptyListException(): out_of_range("Empty List!\n") {} 

}; 

#endif // EMPTYLISTEXCEPTION_H 

입니다 - Clist.h에

template <typename E> 
E Clist<E>::Remove() throw() 
{ 
    if(isEmpty()) 
    { 
     cout << "Empty List, no removal"; 
     //throw EmptyListException(); 
     return '.'; 
    } 
     ... code 
} 

명령을 던져 -이 응용 프로그램 '홈페이지

try{ 
    cout << list->Remove() << endl; 
} catch(EmptyListException &emptyList) 
{ 
    cout << "Caught :"; 
    cout << emptyList.what() << endl; 
} 

오류에서 캐치를 런타임에 요청했다 비정상적인 방법으로 종료하십시오. 자세한 내용은 응용 프로그램 지원 팀에 문의하십시오.

+0

왜'복귀, ''. '? E는 챠일 일 필요가 없다. – LeeNeverGup

+3

'Remove()'의 정의에서'throw()'를 제거해보십시오. – xaizek

+0

돌아 가기 '.'; 난 그냥 함수를 끝내고 싶어요, 다시 빈 데이터 형식을 보내고 싶었어요. 보통이 함수는 제거 된 노드 데이터를 반환합니다. – George

답변

5

글쎄, 당신은 당신이 당신의 Remove()에서 예외를 던지려는 중이라고 컴파일러에게 말했습니다! 이 약속을 어기면 프로그램이 종료됩니다. 함수 선언에서 throw()을 제거하고 다시 시도하십시오.

+0

감사합니다. 모든 문제가 수정되어 원래 게시물이 업데이트되었습니다. – George

3

Remove 함수의 서명에있는 throw()은 해당 함수에서 아무 것도 던지지 않을 것이라는 약속입니다. 내부에서 물건을 던지려면 이걸 제거해야합니다.

1

문제는 throw 지정자가 특별하다는 것입니다.

빈 예외 목록없이 사용
void func() throw(Ex1, Ex2, std::bad_alloc); 

,이 때문에 나타냅니다

일반적으로, 함수가 (상속은 평소와 같이 작업과 함께)를 돌려주는 일이 있습니다 예외 목록 정확한에 사용되는 가정한다 이 방법은 결코 던지십시오. 던지면 런타임에 std::terminate이 즉시 호출됩니다.이 호출은 기본적으로 프로그램을 종료합니다.

일반적으로 예외 사양을 사용하면 안됩니다.

참고 : C++ (11)는 ... 함수가 훨씬 더 직관적, 발생하지 않는다는 것을 나타 내기 위해 noexcept 키워드를 도입

관련 문제