외부 소멸자에서 발생한 예외를 처리 할 수없는 이유는 무엇입니까?

거장

C ++ primer 5th edition ch18 on Exception Handling에서 소멸자는 일반적으로 STL 컨테이너와 같은 예외를 throw해서는 안되며, 그래야하는 경우 throw 된 식은 try-catch 블록에 래핑되어야한다는 것을 읽었습니다 (catch는 해당 예외를 처리해야 함). .

  • 나는 목적을 이해하기 위해 이것을 시도했습니다.

      struct Foo{
          Foo(){
              std::cout << "Foo()\n";
          }
          ~Foo(){
              std::cout << "~Foo()\n";
              throw "exception thrown from Foo::~Foo()\n";
              std::cout << "Back in Foo::~Foo()\n";
          }
      };
    
    
      int main(){
    
          try{
              Foo f{};
              Foo* pFoo = new Foo{};
              delete pFoo; // normally exception caught here nad handled by the following catch
          }
          catch(char const* const& cp){
              std::cout << cp << '\n';
          }
    
          std::cout << '\n';
      }
    
  • IMHO Foo의 Destructor는 Destructor 외부의 핸들러가 해당 예외를 포착 할 수 없기 때문에 여기에서 해당 예외를 throw해서는 안됩니다. 소멸자는 개체가 범위를 벗어나고 try-catch 블록이 항상 블록 안에있을 때마다 호출되기 때문입니다. 즉, try-catch blcok 후에 소멸자가 호출되기 때문입니다.

  • 그러나 우리가 알다시피 소멸자를 조기에 호출 할 수 있습니다. 예를 들어 명시 적으로 호출하거나 유효한 동적 메모리를 가리키는 클래스 / 구조체 유형의 포인터를 삭제합니다. 따라서이 경우에는 try-block일반적으로 해당 핸들러에서 처리 할 수있는 내부 소멸자를 호출 할 수 있습니다.

  • 그러나 내 프로그램은 항상 terminate()(처리되지 않은 예외의 신호로) 호출 하고 경고를받습니다.

warning: throw will always call 'terminate' [-wterminate].

  • AS 당신은 내가 호출하고 볼 수 있습니다 Foo소멸자 내부 try-block에서 main: delete Foo. 내가 쓴 경우에도 똑같이 할 수 있습니다 f.~Foo();.

  • 그렇다면 누군가 그 이유를 설명 할 수 있습니까? 감사합니다!

가장 큰 _prime_is_463035818

추천 내용을 오해하신 것 같습니다.

소멸자는 일반적으로 STL 컨테이너와 같은 예외를 throw해서는 안되며, 필요한 경우 throw 된 식을 try-catch 블록으로 래핑해야합니다 (catch가 해당 예외를 처리해야 함).

즉, 다음과 같이 말합니다.

소멸자에서 예외를 throw해서는 안됩니다.

이제 소멸자가 다음과 같은 경우 어떻게해야하는지 의문이 생깁니다.

~Bar() {  
   do_something();
}

do_something()예외가 발생할 수 있습니다. 이 경우 권장 사항은 예외를 포착하고 처리하는 것입니다.

~Bar() {
    try {
        do_something();
    } catch(...) {
       // handle exception, eg write a log message
       // but do not retrow it or a different one!
    }
}

이제 예외가 소멸자를 떠나는 방법은 없습니다.


아시다시피 소멸자 외부에서 예외를 포착하는 것은 일반적인 문제를 해결하는 데 도움이되지 않습니다.

 try{
          Foo f{};
          Foo* pFoo = new Foo{};
          delete pFoo; // normally exception caught here nad handled by the following catch
      }

delete pFoo;예외를 발생시키는 호출 입니다. 스택 해제 중에는 Foo f{};소멸자에서 다른 예외가 발생합니다. 스택 해제 중에 예외가 발생 std::terminate하면 호출됩니다. 그리고 그것을 피하는 방법은 소멸자에서 예외를 던지지 않는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Undertow 작업자 스레드에서 발생한 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

왜이 예외는 처리 할 수없는 이유는 무엇입니까?

분류에서Dev

오류 처리기가 비동기 미들웨어에서 발생한 예외를 처리하지 않는 이유는 무엇입니까?

분류에서Dev

AutoCloseable에서 발생한 예외를 처리 (또는 억제)하는 권장 방법은 무엇입니까?

분류에서Dev

기본 Django 쿼리를 실행할 때 int () 예외 오류에 대한 잘못된 리터럴이 발생하는 이유는 무엇입니까?

분류에서Dev

C ++에서 외부 유형을 내부 유형처럼 표시 할 수없는 이유는 무엇입니까?

분류에서Dev

서비스 외부에서 발생하는 예외를 처리 할 때 요청 dto에 액세스 할 수 있습니까?

분류에서Dev

예외가 발생할 수없는 경우 예외를 throw하고 처리해야합니까?

분류에서Dev

저지에서 streamoutput 응답을 사용할 때 이미 일부 출력을 플러시 한 후 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

"이 작업을 수행 할 권한이 없음"예외가 발생하는 이유는 무엇입니까?

분류에서Dev

clang이이 간단한 std :: variant 코드에 대한 예외를 처리하는 이유는 무엇입니까?

분류에서Dev

오버플로 메뉴에서 빈 값을 처리하려고 할 때이 예외가 발생하는 이유는 무엇입니까?

분류에서Dev

Appcache Manifest를 사용하여 외부 리소스를 요청할 때 jQuery에서 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

함수 호출에서 예외가 발생하면 처리를 계속하는 방법은 무엇입니까?

분류에서Dev

유사한 rx 연산자의 예외로 인해 처리되지 않은 예외가 발생하는 반면 SelectMany에서 예외가 발생한 후에도 프로세스가 여전히 살아있는 이유는 무엇입니까?

분류에서Dev

lua 코드에서 오류가 발생할 때 luabind :: error 예외를 포착 할 수없는 이유는 무엇입니까?

분류에서Dev

한 활동에서 다른 활동으로 문자열 ArrayList를 전달할 때 널 포인터 예외가 발생하는 이유는 무엇입니까?

분류에서Dev

TSA를 적용 할 때 '공간 부족'예외가 발생하는 이유는 무엇입니까?

분류에서Dev

쿼리 EF에서 "Include ("PropertyName ")"를 사용하려고 할 때 Argument 예외가 발생하는 이유는 무엇입니까?

분류에서Dev

낮은 수준의 패키지 또는 함수 호출에서 발생한 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

Toplink를 사용하여 JPQL 조인 쿼리에서 예외가 발생하는 이유는 무엇입니까?

분류에서Dev

페이지 외부에서 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

Process.run에서 발생하는 예외를 어떻게 처리 할 수 있습니까?

분류에서Dev

이 메서드는 예외가 발생할 때 메모리 누수를 유발합니까?

분류에서Dev

시스템이 나노초에 발생한 이벤트를 처리 할 수 없습니다. 이유는 무엇입니까?

분류에서Dev

main () 메서드 외부에서 ArrayList에 요소를 추가 할 수없는 이유는 무엇입니까?

분류에서Dev

기본 생성자는 암시 적 슈퍼 생성자가 던진 예외 유형 예외를 처리 할 수 없습니다.

분류에서Dev

객체에서 문자열로 변환 할 때 null 예외를 처리하는 방법은 무엇입니까?

분류에서Dev

이 Python 스크립트에 대한 연결 거부 예외가 발생하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Undertow 작업자 스레드에서 발생한 예외를 처리하는 방법은 무엇입니까?

  2. 2

    왜이 예외는 처리 할 수없는 이유는 무엇입니까?

  3. 3

    오류 처리기가 비동기 미들웨어에서 발생한 예외를 처리하지 않는 이유는 무엇입니까?

  4. 4

    AutoCloseable에서 발생한 예외를 처리 (또는 억제)하는 권장 방법은 무엇입니까?

  5. 5

    기본 Django 쿼리를 실행할 때 int () 예외 오류에 대한 잘못된 리터럴이 발생하는 이유는 무엇입니까?

  6. 6

    C ++에서 외부 유형을 내부 유형처럼 표시 할 수없는 이유는 무엇입니까?

  7. 7

    서비스 외부에서 발생하는 예외를 처리 할 때 요청 dto에 액세스 할 수 있습니까?

  8. 8

    예외가 발생할 수없는 경우 예외를 throw하고 처리해야합니까?

  9. 9

    저지에서 streamoutput 응답을 사용할 때 이미 일부 출력을 플러시 한 후 예외를 처리하는 방법은 무엇입니까?

  10. 10

    "이 작업을 수행 할 권한이 없음"예외가 발생하는 이유는 무엇입니까?

  11. 11

    clang이이 간단한 std :: variant 코드에 대한 예외를 처리하는 이유는 무엇입니까?

  12. 12

    오버플로 메뉴에서 빈 값을 처리하려고 할 때이 예외가 발생하는 이유는 무엇입니까?

  13. 13

    Appcache Manifest를 사용하여 외부 리소스를 요청할 때 jQuery에서 오류가 발생하는 이유는 무엇입니까?

  14. 14

    함수 호출에서 예외가 발생하면 처리를 계속하는 방법은 무엇입니까?

  15. 15

    유사한 rx 연산자의 예외로 인해 처리되지 않은 예외가 발생하는 반면 SelectMany에서 예외가 발생한 후에도 프로세스가 여전히 살아있는 이유는 무엇입니까?

  16. 16

    lua 코드에서 오류가 발생할 때 luabind :: error 예외를 포착 할 수없는 이유는 무엇입니까?

  17. 17

    한 활동에서 다른 활동으로 문자열 ArrayList를 전달할 때 널 포인터 예외가 발생하는 이유는 무엇입니까?

  18. 18

    TSA를 적용 할 때 '공간 부족'예외가 발생하는 이유는 무엇입니까?

  19. 19

    쿼리 EF에서 "Include ("PropertyName ")"를 사용하려고 할 때 Argument 예외가 발생하는 이유는 무엇입니까?

  20. 20

    낮은 수준의 패키지 또는 함수 호출에서 발생한 예외를 처리하는 방법은 무엇입니까?

  21. 21

    Toplink를 사용하여 JPQL 조인 쿼리에서 예외가 발생하는 이유는 무엇입니까?

  22. 22

    페이지 외부에서 예외를 처리하는 방법은 무엇입니까?

  23. 23

    Process.run에서 발생하는 예외를 어떻게 처리 할 수 있습니까?

  24. 24

    이 메서드는 예외가 발생할 때 메모리 누수를 유발합니까?

  25. 25

    시스템이 나노초에 발생한 이벤트를 처리 할 수 없습니다. 이유는 무엇입니까?

  26. 26

    main () 메서드 외부에서 ArrayList에 요소를 추가 할 수없는 이유는 무엇입니까?

  27. 27

    기본 생성자는 암시 적 슈퍼 생성자가 던진 예외 유형 예외를 처리 할 수 없습니다.

  28. 28

    객체에서 문자열로 변환 할 때 null 예외를 처리하는 방법은 무엇입니까?

  29. 29

    이 Python 스크립트에 대한 연결 거부 예외가 발생하는 이유는 무엇입니까?

뜨겁다태그

보관