在C++中继承异常

Awe*_*e36 6 c++ exception

我刚刚创建了一个异常层次结构,并希望我的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的消息,但我希望它显示更具体的派生消息.那么我需要做什么才能让我按照我想要的方式工作呢?

Dal*_*son 9

当你这样抓住时:

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引用捕获它们.