메쏘드에서 예외를 던질때 문법이 어떻게 되는지요?
글쓴이: vudghkzm / 작성시간: 월, 2005/03/07 - 10:09오전
c++ 에서 예외를 던지는 멤버 메쏘드를 작성하고, 이 메쏘드는 항상 쓰일 때는 try, catch 문안에 쓰여야 한다고 정해줄 수 있는 방법이 잇는지요?
아래와 같이 했습니다.
void A::a() { .... throw 1; .... throw 2; }
그런데 위와 같이 작성하니깐 메쏘드 a() 를 쓸때 굳이 try catch 문장 안에 사용하지 않아도 컴파일과 실행시에(예외가 발생하지 않는 상황) 아무 문제가 없더라구요.
그런데 제가 원하는건 a() 라는 메쏘드는 항상 try, catch 문안에 쓰이도록 사용자에게 유도하는 것입니다. 예를 들어, a() 메쏘드를 try catch 문 안에 쓰이지 않으면 컴파일 에러를 던져 준다던가 하는거 말입니다.
이게 가능한가요?
Forums:
불가능합니다. try / catch 로 예외를 받아서 검출하는 단계는 라
불가능합니다. try / catch 로 예외를 받아서 검출하는 단계는 라이브러리나 클래스 제작 단계에서는 알 수가 없고, 이것을 강제할 방법은 없습니다. 예외를 어플리케이션 최상단에서 처리를 할지 지역적으로 처리해야 할지는 사용하는 사람의 마음이기 때문이겠죠. 결국 처리하지 않는다면 예외가 일어날 때, 프로그램이 죽는 결과가 나올겁니다.
불가능합니다.만약 클래스 사용자에게 이 함수가 예외를 던진다는 것을
불가능합니다.
만약 클래스 사용자에게 이 함수가 예외를 던진다는 것을 더 명확히 하고 싶으면
예외 명세(exception specification)을 쓸 수는 있습니다.
void A::a() throw(int);
그러나 예외 명세는 신중하게 사용하실 것을 권합니다. 예외 명세를 쓰면 추가로
신경쓸 것이 많아지고 런타임에 약간의 부담이 더해지니까요.
http://www.gotw.ca/gotw/082.htm이나 More Effective C++에
보시면 잘 나와있습니다.
혹시 자바 프로그래밍을 하다 c++을 공부하고 계신지...?말씀하
혹시 자바 프로그래밍을 하다 c++을 공부하고 계신지...?
말씀하신 기능을 흔히 checked exception 이라고 부릅니다. 제가 알기로 자바를 제외한 대부분의 언어에서 checked exception 은 지원하지 않거나 선택사항으로 두고 있습니다. 그리고 심지어 자바에서조차 요새는 checked exception의 폐해를 지적하는 경우가 많습니다. 실패한 실험이라는 분위기가 지배적이지요. 아래글을 한번 읽어보세요.
http://www.mindview.net/Etc/Discussions/CheckedExceptions
http://radio.weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html
자바의 예외와 같이 사용하고 싶으신가 보네요.그런데, doldor
자바의 예외와 같이 사용하고 싶으신가 보네요.
그런데, doldori 님이 말씀하신 바와 같이 예외명세의 사용에 있어서 신중하셔야 합니다.
C++에서의 그것은 자바와 크게 다릅니다.
자바에선 단지 try catch 를 반드시 사용하게끔 강제하는 기능입니다만,
C++ 에서 명세를 하면 명세된 예외만 throw 하게 됩니다.
즉, try catch를 사용하던 안하던 그것과는 무관하며,
명세된 예외만 그 메소드에서 throw 되게 한정하는것이 됩니다. 따라서, 하부에서 올라오는 다른 예외들도 모두 그 메소드에서 더이상 throw되지 못합니다. 그러므로, 상단에서 다른 예외의 catch구문이 있다하여도 잡아내지를 못하게 됩니다.
혹시 잘못된점이 있으면 지적해 주시기 바랍니다.
[quote="SaNha"]C++ 에서 명세를 하면 명세된 예외만 thr
그렇지는 않습니다. C++에서는 예외가 "throw 되지 못"하는 경우는 없습니다.
표준은 예외 명세에 명시되지 않은 예외를 던지는 것을 금지하지 않으며, 컴파일러도
예외 명세와 실제로 던져지는 예외가 일치하는지 완전하게 검사할 수 없습니다.
그렇다면 애당초 예외 명세라는 것을 뭐하러 만들었는가 하는 의문이 생길 수 있는데,
이에 대해서는 의견이 분분하고 저 자신도 딱 부러지게 판단할 만한 경험이 없으므로
표준에서 정해진 예외 명세의 규칙에는 그럴 만한 이유(rationale)가 있다는 점만
언급하고 넘어가겠습니다.
만약 예외 명세와는 다른 예외를 던질 경우 stack unwinding 작업을 거친 후에
디폴트로 std::unexpected() 함수가 호출되고 이 함수는 std::terminate()를
호출하며 따라서 일체의 cleanup 과정 없이 바로 프로그램이 중단됩니다. 극단적인
상황이죠. 그런데 이런 디폴트 동작이 적절하지 않을 수도 있으므로 std::set_unexpected()
함수를 통하여 다른 행동을 취하도록 변경할 수 있는 여지를 남겨두고 있습니다.
표준은 unexpected handler로부터의 return을 금지하고 있으나 그 핸들러가
예외를 던지는 것은 허용합니다. 이 점을 이용하여 unexpected 핸들러 내에서
예외 명세와 일치하는 예외를 던지거나 rethrow에 의해 bad_exception 예외를
던져 프로그램을 중단하지 않고 적절한 조치를 취한 후에 다시 실행을 계속할 수
있는 것이죠. 쓰다 보니까 얘기가 너무 길어질 것 같아서 이에 대해 잘 설명하고
있는 링크로 대신하겠습니다.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndeepc/html/deep102199.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndeepc/html/deep111899.asp
여기 계신 분들이 대체로 싫어하는 MS의 사이트입니다만, C++의 예외 메커니즘에
대해 자세하고 정확하게 설명하고 있으므로 충분히 도움이 되리라 봅니다. 또한
More Effective C++에서도 잘 설명되어 있으니 참고하십시오.
ps. 어쨌든 예외 명세를 쓰면 골치가 좀 아파집니다. -_-;
관련해서 예외 명세에 관해 kwanny 님이 gpgstudy 에 좋은 내
관련해서 예외 명세에 관해 kwanny 님이 gpgstudy 에 좋은 내용을 적으신 것이 있어 덧글 답니다.
http://gpgstudy.com/forum/viewtopic.php?t=3507
핵심을 긁자면..
네.. C++ 에서 예외명세를 사용했을때, 명세되지 않은 예외가 thro
네.. C++ 에서 예외명세를 사용했을때, 명세되지 않은 예외가 throw될때의 상세한 메카니즘은 저도 이번에 상세히 배우게 됐습니다만,..
표현의 차이는 있지만 제가 얘기하고자 했던것과 결국 같은 내용이 아닌가 싶습니다. 저도 컴파일타임을 얘기한것이 아니라 실행타임의 결과를 말한것입니다.
명세되지 않은 예외는(하위에서 올라오는 예외를 포함한) 상위로 throw 되지 못하고 (물론, std::set_unexpected() 를 통하여 처리할 수 는 있지만) std::terminate() 를 호출하며 종료되니깐요.
아시다시피 자바에서는,.. 명세를 해 놓으면, 반드시 그 메소드 내에서 그 예외에 대하여 try catch를 사용해야 컴팔이 되게 하는 역할이지만 다른 예외(하부에서 올라오는것을 포함한) 의 전파와는 무관하니깐.. 이 부분에서 특히 차이점을 잘 이해해서 C++의 예외명세를 사용해야 하지 않을까 싶습니다. (사실, C++ 에서 이것을 쓸 사람이, 혹은 그 용도가 있을까 싶습니다만...)
예외는 exit(0) 와 같습니다.
예외를 던지시는분은 얼마나 예외를 제대로 처리하시는지를 생각해보시는게...
님ㅎ 즐~
댓글 달기