当前位置:  开发笔记 > 编程语言 > 正文

在C++中继承异常

如何解决《在C++中继承异常》经验,为你挑选了1个好方法。

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



1> Dale Wilson..:

当你这样抓住时:

catch (TGAException e) {
    cout << e.what() << endl;
}

编译器复制原始异常并将其分配给e.它使用TGAException复制构造函数,因此在catch块中看到的异常不是ImagetypeException,而是TGAException.这种现象称为物体切片.

如果你这样抓住它:

catch (const TGAException & e) {
    cout << e.what() << endl;
}

不需要复制,它将按照您的预期方式工作.

作为一般准则:始终通过引用捕获异常,并且几乎总是通过const引用捕获它们.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有