我刚刚创建了一个异常层次结构,并希望我的catch-block显示派生异常的消息.我有5个例外,比如这个:
class ImagetypeException : public TGAException { public: const char* what() const throw(); }; const char* ImagetypeException::what() const throw() { return "Der Bildtyp ist nicht \"RGB unkomprimiert\"."; }
所有这些都是从TGAException派生的,它是从std :: exception派生的.
class TGAException : public std::exception { public: virtual const char* what() const throw(); }; const char* TGAException::what() const throw() { return "Beim Einlesen oder Verarbeiten der TGA-Datei ist ein unerwarteter Fehler aufgetreten!"; }
因此,我显然希望在我的代码中的某些时候抛出这些内容,并认为最小化我需要的catch块数量可能是个好主意.
catch (TGAException e) { cout << e.what() << endl; }
如果我这样做,将打印的消息是来自TGAException的消息,但我希望它显示更具体的派生消息.那么我需要做什么才能让我按照我想要的方式工作呢?
当你这样抓住时:
catch (TGAException e) { cout << e.what() << endl; }
编译器复制原始异常并将其分配给e.它使用TGAException复制构造函数,因此在catch块中看到的异常不是ImagetypeException,而是TGAException.这种现象称为物体切片.
如果你这样抓住它:
catch (const TGAException & e) { cout << e.what() << endl; }
不需要复制,它将按照您的预期方式工作.
作为一般准则:始终通过引用捕获异常,并且几乎总是通过const引用捕获它们.