常见错误处理
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++程序设计语言》