C++的异常[转载]

转自:http://www.cnblogs.com/CUCmehp/archive/2009/01/12/1374320.html

C++函数后面后加到关键字throw(something)限制,是对这个函数的异常安全性作出限制。

void f() throw()  表示f不允许抛出任何异常,即f是异常安全的。

void f() throw(...) 表示f可以抛出任何形式的异常。

void f() throw(exceptionType); 表示f只能抛出exceptionType类型的异常。

引别人的一个笑话:

throw() 大概会说:“噢,不管你抛什么,就是不准抛。。”
throw(...) 呵呵一笑,满脸慈祥:“抛吧抛吧,尽情地抛吧。。。”
throw(type) 一听急了:“那可不行,要抛也只能抛我的香烟头,否则要是不小心把俺祖传的金戒指抛掉就太亏了。。。”

关于C++的异常传递有三种方法:

1.传值(by value)

传值的过程中会产生临时对象的拷贝,不能解决多态的问题,如下:myexception继承exception,但是但确无法被正确的调用myexception的方法,造成对异常对象的切割。

class myexception:public exception{
public:
    virtual const char* what() throw();
};
const char* myexception::what(){
    return "myException";
}
class A{
public:
    A(){}
    void f() throw(){
        throw myexception();
    }
};
int main(){
    A a;
    try{
        a.f();
    }catch(exception exc){
        cout<<exc.what();
    }
}

运行结果:UnKnown exceptions

程序执行是会调用exception的what方法,而不是myexception的what方法。

2.传指针(by pointer)

指针可以实现多态,但往往会将临时对象的地址作为指针传出去,出现悬挂指针错误。如果在堆上分配内存空间,又往往不知道何时删除对象,出现to be or not to be的错误。

结果显示:myException
Code
class myexception:public exception{
public:
    virtual const char * what() const;
};
const char* myexception::what() const{
    return "myException";
}
class A{
public:
    A(){}
    void f() throw(){
        throw new myexception();
    }
};
int main(){
    A a;
    try{
        a.f();
    }catch(exception* pexc){
        cout<<pexc->what();
        delete pexc;
    }
}

3.传引用(by reference)

传引用是最好的方法,可以克服前面的两个问题。

程序结果显示:myException

Code
class myexception:public exception{
public:
    virtual const char * what() const;
};
const char* myexception::what() const{
    return "myException";
}
class A{
public:
    A(){}
    void f() throw(){
        throw myexception();
    }
};
int main(){
    A a;
    try{
        a.f();
    }catch(exception& exc){
        cout<<exc.what();
    }
}

C++的异常[转载]相关推荐

  1. 系统异常设计规范与原则

    为什么80%的码农都做不了架构师?>>>    1.系统异常设计的出发点: 良好的异常信息展示,开发运维人员能快速定位问题. 响应外部调用异常时,应能明确指明是内部异常还是调用条件不 ...

  2. python的logging模块,记录所发生的异常。

    import logging import os import timedef logger(user_name):"日志功能模块"logger = logging.getLogg ...

  3. 【Java基础】Java常见的异常

    Java常见的异常 1. java.lang.NullPointerException (空指针异常)调用了未经初始化的对象或者是不存在的对象 2. java.lang.ClassNotFoundEx ...

  4. 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法...

    今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: String pat ...

  5. android常见异常总结

    为什么80%的码农都做不了架构师?>>>    Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示: Throwable Throwa ...

  6. JAVA 异常 throw 与 throws

    最近一直throw和throw new -- 获取头部罢工,要彻底生气清楚这件事,他对这个思想精华收集了很多网友.这里摘录. throws全部异常信息 throw则是指抛出的一个详细的异常类型. 通常 ...

  7. Xcode9 2 编译在iOS8 1 系统上图片显示异常

    趁着下载Xcode 9.1 的空隙,在周末的早晨记录一下这个坑,希望能解决相同遭遇同行的困惑. 始因 昨天刚发布了适配iPhone X 的最新版本,之所以使用Xcode 9.2打包,是因为早期的适配, ...

  8. Java核心API -- 9(异常)

    异常处理 异常结构中的父类Throwable类,其下子类Exceptionlei类和Error类.我们在程序中可以捕获的是Exception的子类异常. Error系统级别的错误:Java运行时环境出 ...

  9. python中自定义超时异常的几种方法

    最近在项目中调用第三方接口时候,经常会出现请求超时的情况,或者参数的问题导致调用异代码异常.针对超时异常,查询了python 相关文档,没有并发现完善的包来根据用户自定义的时间来抛出超时异常的模块.所 ...

最新文章

  1. vue.js快速入门
  2. GdiPlus[28]: IGPPen: 建立复合画笔
  3. Eclipse导入项目常见问题----jdk版本问题(有个红色感叹号)01
  4. 死锁解决(oracle)
  5. 打分排序系统漫谈1 - 时间衰减
  6. Hybris Accelerator 搭建调试环境时遇到的错误消息
  7. qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用
  8. 数据镜像备份工具rsync + inotify
  9. 华为云平台创建产品+注册设备
  10. python listdir报错_Python常见十六个错误集合,你知道那些?
  11. Nuro发布自家自动驾驶安全报告,提出无人车12大安全要素 | 报告下载
  12. knockout + require + director 构建单页面程序(director)
  13. 教孩子学编程python pdf_教孩子学编程 PYTHON语言版 PDF_IT教程网
  14. java集成信鸽推送
  15. 小孔子内容管理系统V2.0测试
  16. “单向网闸”技术介绍-网络隔离的新型产品
  17. 微型机器学习,会是下一代AI革命吗?
  18. 《大数据时代》(维克托·迈尔·舍恩伯格)读书笔记
  19. ps去除图片中的文字、图层锁定不能解开问题
  20. Email营销课堂:邮件群发平台与软件区别

热门文章

  1. yum 无法安装gcc 出现Run “yum repolist all” to see the repos you have异常
  2. trie树模板(前缀树)
  3. 油管大神教波士顿机器狗学撒尿-给自己倒啤酒,网友:太恶趣味了
  4. 登录失败:用户帐户限制。可能的原因包括不允许空密码,登录时间限制,或强制的策略限制。 ...
  5. Android中获取文本宽度和高度
  6. Programming Ruby 读书笔记(四)
  7. 【原创】2009年8月18日老谷项目管理MSN群专题—项目案例分享文字实录
  8. 网易云音乐评论 可视化分析
  9. SAP MR21修改标准价
  10. 流域水库水闸和泵站无人值守系统