throw T
런타임 예외 저장소가 객체를 소유합니다.
catch 타입 매칭에 쓸 실제 타입이 유지됩니다.
예외 시스템이 수명을 관리합니다.
예외 객체의 소유권은 예외 처리 메커니즘에 맡기고, catch 블록은 복사 없이 타입 정보와 메시지만 안정적으로 읽는 구조가 기본입니다.
throw MyException(...)처럼 객체 값을 넘깁니다.
catch (const MyException& e)로 읽습니다.
throw MyException("file");
현재 함수는 중단되고 예외 객체가 처리 메커니즘으로 넘어갑니다.
값 전달 exception object
복사 또는 이동된 객체를 런타임이 보관하고 스택 풀기가 진행됩니다.
소유권 분리
catch (const T& e)
추가 복사를 만들지 않고 파생 예외의 실제 타입 정보를 보존합니다.
slicing 방지throw new T(...)
catch 블록에 delete 책임이 생겨 누수와 중복 해제 위험이 커집니다.
비권장throw T
런타임 예외 저장소가 객체를 소유합니다.
catch 타입 매칭에 쓸 실제 타입이 유지됩니다.
예외 시스템이 수명을 관리합니다.
catch (const T& e)
큰 예외 객체도 안정적으로 읽습니다.
파생 예외의 실제 타입 정보를 잃지 않습니다.
catch 블록에서 delete가 필요 없습니다.
throw new T
소유권을 누가 갖는지 불명확해집니다.
포인터 타입과 객체 타입을 따로 관리해야 합니다.
누수와 중복 해제 위험이 catch 블록으로 옮겨갑니다.
catch (const MyException& e)
도메인 오류를 먼저 복구하거나 사용자 메시지로 바꿉니다.
catch (const std::exception& e)
표준 예외 계층의 공통 안전망으로 what()을
기록합니다.
지역 객체 소멸자가 호출되므로 자원 해제 코드는 객체가 책임지게 둡니다.