异常处理

常见错误处理

                            1)通过函数直接返回bool值或者int值判断错误

                            2)像c语言一些库一样,定义全局的errno,对errno返回值做出分析处理

                            3)使用异常处理

                            4)终止程序

异常处理

                     可以使程序中独立开发的各个部分在执行期间出现的问题相互通信,并处理。可以将问题的检测和处理分割开来。异常处理机制是一种非局部的控制结构,基于堆栈回退的,可以看做另一种返回机制。

                     异常通过throw对象而引发,对象的类型决定激活哪个处理代码。执行throw时,不会执行throw后面代码,而是将控制从throw转移到匹配的catch。

                      控制是指:函数的调用提早退出,处理异常的时候,抛出异常块中的局部存储不存在了。用throw初始化为异常对象,是被抛出表达式的副本,由编译器管理。

                      throw对象的类型:非引用的类对象(复制该对象),数组(转化为首地址的指针),函数(转化为指向该函数的指针)

                      当抛出一个表达式时候,被抛出对象静态编译时类型决定异常对象的类型

                      在栈回退期间,释放局部对象的内存并运行类类型局部对象的析构函数。new分配的动态内存不会被释放

                      析构函数不应该抛出异常,如果抛出异常,会导致调用标准库terminate函数。terminate函数会调用abort函数,导致整个程序非正常退出。

                      构造函数抛出异常,会导致该对象部分初始化。

                      auto_ptr模板类支持“资源申请及初始化”技术。可以用指针初始化,当退出作用域时,指向的对象被隐式的删除。只能保存指向一个对象的指针,不能保存数组,不保存静态对象的指针,复制和赋值都具有破坏性。

自定义异常基类

class Exception : public std::exception //可以通过它派生出自己所需要的异常类
{
public:
    Exception(const Exception& e) throw() ://不抛出任何异常
    std::exception(e),
    what_(e.what_)
    {
    }
    Exception& operator = (const Exception& rhs) throw()
    {
        what_ = rhs.what_;
        return *this;
    }
    ~Exception() throw() { }
    virtual const char* what() const throw()
    {
        return what_.c_str();
    }

protected:
    Exception(const char* w = "") throw() :
    what_(w)
    {
    }
    Exception(const std::string& w) throw() :
    what_(w)
    {
    }
    std::string what_;
};

异常管理类

class  OptionalExceptions
{
public:
    OptionalExceptions(bool e = true) ://异常默认开启
    exceptions_(e)
    {
    }
    virtual ~OptionalExceptions() { }
    void enable_exceptions() const { exceptions_ = true; } //开启异常
    void disable_exceptions() const { exceptions_ = false; }//关闭异常
    bool throw_exceptions() const { return exceptions_; }// 判断异常状态

protected:
    void set_exceptions(bool e) const { exceptions_ = e; }
    friend class NoExceptions;

private:
    mutable bool exceptions_; //变量可以改变,即使在const函数中
};

关闭异常类

class  NoExceptions
{
public:
    NoExceptions(const OptionalExceptions& a) :// 保存异常,关闭异常标志位
    no_(a),
    exceptions_were_enabled_(a.throw_exceptions())
    {
        no_.disable_exceptions();
    }
    ~NoExceptions() //恢复异常标志
    {
        no_.set_exceptions(exceptions_were_enabled_);
    }
    
private:
    const OptionalExceptions&  no_;//说明希望不要更改,const成员变量只能通过初始化列表初始化
    bool exceptions_were_enabled_;
    NoExceptions(const NoExceptions&);//禁止复制和赋值
    NoExceptions& operator=(const NoExceptions&);
};

PS:参考资料《c++primer》   《c++程序设计语言》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值