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();
.
그렇다면 누군가 그 이유를 설명 할 수 있습니까? 감사합니다!
추천 내용을 오해하신 것 같습니다.
소멸자는 일반적으로 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] 삭제
몇 마디 만하겠습니다