我刚刚创建了一个异常层次结构,并希望我的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\".";
}
Run Code Online (Sandbox Code Playgroud)
所有这些都是从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!";
}
Run Code Online (Sandbox Code Playgroud)
因此,我显然希望在我的代码中的某些时候抛出这些内容,并认为最小化我需要的catch块数量可能是个好主意.
catch (TGAException e) {
cout << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,将打印的消息是来自TGAException的消息,但我希望它显示更具体的派生消息.那么我需要做什么才能让我按照我想要的方式工作呢?
当你这样抓住时:
catch (TGAException e) {
cout << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
编译器复制原始异常并将其分配给e.它使用TGAException复制构造函数,因此在catch块中看到的异常不是ImagetypeException,而是TGAException.这种现象称为物体切片.
如果你这样抓住它:
catch (const TGAException & e) {
cout << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
不需要复制,它将按照您的预期方式工作.
作为一般准则:始终通过引用捕获异常,并且几乎总是通过const引用捕获它们.