none
예외 관련 질문 드립니다.

    질문

  • C#에서 예외처리를 할 경우

    try

    {

    예외가 발생되는 구문

    }catch(Exception ex)

    {

    Message.Box(ex.ToString()); //처리되지 않은 모든 예외에 대해서 해당 예외를 보여주고 있습니다.

    }

    이런식으로 C++도 당연히 구현될꺼라고 생각하는데 안되는건가요?

    제가 구현해본 예제는 이렇습니다.

    try

    {

    예외가 발생되는 구문

    }catch(...) //MSDN설명을 보니 모든 예외는 이렇게 작성하라고 되어 있더군요.

    {

    //예외에 대한 메시지를 어떻게 출력해야 할까요?

    }


    2012년 8월 13일 월요일 오전 2:56

답변

  • 안녕하세요.

    먼저 질문하신 물음에 대한 간단한 답은 컴파일 옵션으로 /EHa를 지정하시고 릴리즈 모드에서 실행하시면 메세지 박스를 볼 수 있습니다.

    이 부분을 이해하시려면 부가적인 설명이 조금 더 필요 합니다. 

    VC 프로그래밍에서는 두가지의 익셉션 타입을 염두하셔야 합니다. 하나는 CEH(C++ Exception Handling), 다른 하나는 SEH(Structrued Exception Handling)입니다.

    CEH는 try-catch, SEH는 __try-__except 키워드를 사용하고 C++ 의 논리적인 익셉션은 CEH로, 프로그램상 윈도즈가 진행할 수 없는 익셉션 처리는 SEH로 처리를 합니다.

    두가지의 익셉션 스타일의 구분은 모양 뿐만 아니라 사용법에 있어서도 조금 다릅니다. 예를 들면 SEH는 try 블럭 안쪽에 클래스의 인스턴스를 사용하지 못하지만 CEH는 그러한 제약이 없다던가 하는게 다릅니다.

    CEH는 컴파일 옵션에 따라 사용되지 않을 수 있으며, 사용되지 않는 코드는 컴파일 과정에서 없어질 수 있습니다. 질문자께서 작성하신 코드와 환경은 추측하건데 try-catch 코드 자체가 컴파일 과정에서 생략되어 메세지 박스 코드가 아예 바이너리에 포함되지 않아 실행되지 않은것이고, 컴파일 옵션에 따라 해당 익셉션을 다른 타입의 익셉션으로 처리하도록 할 수 있습니다.

    두가지 예외 타입의 차이점이 무엇인가, 언제 어느때 쓰는건가, 내부 동작은 어떻게 되는거고, 최적화는 어떻게 풀리게 되고, 퍼포먼스는 어떻게 변하는가 등은 질문하신 분께서 검색하시고 하나씩 알아가야 되는 과정입니다. 공부하시다가 궁금하신것 있으시면 언제든 질문 하시구요~

    YHKim

    • 답변으로 표시됨 초보 개발자 2012년 8월 22일 수요일 오전 6:54
    2012년 8월 21일 화요일 오전 12:23

모든 응답

  • 안녕하십니까? 초보개발자 님,
    Microsoft MSDN의Forum 사이트를 방문해 주셔서 감사합니다.

    현재 문의 하신 ”예외 관련 질문 드립니다." 대해 답변을 드리겠습니다.

    가장 기본적인 구문은 아래와 같으며, 좀 더 자세한 사항은 아래 C++ Exception Handling 문서를 참고하시는것이 좋을 것 같습니다.

    try {
       // code that could throw an exception
    }
    [ catch (exception-declaration) {
       // code that executes when exception-declaration is thrown
       // in the try block
    }
    [catch (exception-declaration) {
       // code that handles another exception type
    } ] . . . ]
    // The following syntax shows a throw expression:
    throw [expression]

    [예시]

    // exceptions_trycatchandthrowstatements2.cpp
    // compile with: /EHsc
    #include <iostream>
    using namespace std;
    void MyFunc( void );
    
    class CTest {
    public:
       CTest() {};
       ~CTest() {};
       const char *ShowReason() const { 
          return "Exception in CTest class."; 
       }
    };
    
    class CDtorDemo {
    public:
       CDtorDemo();
       ~CDtorDemo();
    };
    
    CDtorDemo::CDtorDemo() {
       cout << "Constructing CDtorDemo.\n";
    }
    
    CDtorDemo::~CDtorDemo() {
       cout << "Destructing CDtorDemo.\n";
    }
    
    void MyFunc() {
       CDtorDemo D;
       cout<< "In MyFunc(). Throwing CTest exception.\n";
       throw CTest();
    }
    
    int main() {
       cout << "In main.\n";
       try {
           cout << "In try block, calling MyFunc().\n";
           MyFunc();
       }
       catch( CTest E ) {
           cout << "In catch handler.\n";
           cout << "Caught CTest exception type: ";
           cout << E.ShowReason() << "\n";
       }
       catch( char *str )    {
           cout << "Caught some other exception: " << str << "\n";
       }
       cout << "Back in main. Execution resumes here.\n";
    }

    그럼에도 어려우실 경우 구체적인 해당 소스를 보여주시면 감사하겠습니다.

    [참조자료]
    C++ Exception Handling

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다..


    2012년 8월 16일 목요일 오전 3:47
  • 답변에 감사드리며 약간의 논점과 다른 점있습니다.제가 드린 질문의 요지는 처리되지 않은 예외 즉, C#에서는 exception 개체만으로 핸들링이 가능한데 C++은 그 부분이 msdn예제를 봐도 없는거 같아서요..
    2012년 8월 16일 목요일 오전 4:27
  • 안녕하세요.

    먼저 질문하신 물음에 대한 간단한 답은 컴파일 옵션으로 /EHa를 지정하시고 릴리즈 모드에서 실행하시면 메세지 박스를 볼 수 있습니다.

    이 부분을 이해하시려면 부가적인 설명이 조금 더 필요 합니다. 

    VC 프로그래밍에서는 두가지의 익셉션 타입을 염두하셔야 합니다. 하나는 CEH(C++ Exception Handling), 다른 하나는 SEH(Structrued Exception Handling)입니다.

    CEH는 try-catch, SEH는 __try-__except 키워드를 사용하고 C++ 의 논리적인 익셉션은 CEH로, 프로그램상 윈도즈가 진행할 수 없는 익셉션 처리는 SEH로 처리를 합니다.

    두가지의 익셉션 스타일의 구분은 모양 뿐만 아니라 사용법에 있어서도 조금 다릅니다. 예를 들면 SEH는 try 블럭 안쪽에 클래스의 인스턴스를 사용하지 못하지만 CEH는 그러한 제약이 없다던가 하는게 다릅니다.

    CEH는 컴파일 옵션에 따라 사용되지 않을 수 있으며, 사용되지 않는 코드는 컴파일 과정에서 없어질 수 있습니다. 질문자께서 작성하신 코드와 환경은 추측하건데 try-catch 코드 자체가 컴파일 과정에서 생략되어 메세지 박스 코드가 아예 바이너리에 포함되지 않아 실행되지 않은것이고, 컴파일 옵션에 따라 해당 익셉션을 다른 타입의 익셉션으로 처리하도록 할 수 있습니다.

    두가지 예외 타입의 차이점이 무엇인가, 언제 어느때 쓰는건가, 내부 동작은 어떻게 되는거고, 최적화는 어떻게 풀리게 되고, 퍼포먼스는 어떻게 변하는가 등은 질문하신 분께서 검색하시고 하나씩 알아가야 되는 과정입니다. 공부하시다가 궁금하신것 있으시면 언제든 질문 하시구요~

    YHKim

    • 답변으로 표시됨 초보 개발자 2012년 8월 22일 수요일 오전 6:54
    2012년 8월 21일 화요일 오전 12:23
  • 완벽한 답변 감사합니다.

    제가 원했던 대답이네요.^^

    2012년 8월 22일 수요일 오전 6:54