标签:
try { // actions that cause an exception to be thrown } catch (...) { // work to partially handle the exception throw; }
在C++中,通过throwing来raised一个exception。当throw时,throw后边的语句不再执行,转移到catch中,这意味:
Catch中的异常声明,可以当成函数列表,如果使用可以为空。
Catch中的异常对象如果非引用,将会发生拷贝
特例的异常处理应该放在与异常最靠近的地方,一般的异常会截获特例
在catch异常中,一般不允许类型转换(允许非const到const、派生类到基类、数组|函数转换到指针)
在异常处理中,如果不能完全处理异常,可以再次抛出。
Catch可以处理所有异常,可以使用【…】为参数
要想处理构造函数初始值抛出的异常,必须将构造函数写成function try blocks,因为在构造初始值时(如下初始化data的时候),并未进入函数,所以在函数中无法处理,只能使用函数try语句块。(这个异常不能处理il构造时的异常)
template <typenameT> Blob<T>::Blob(std::initializer_list<T> il) try : data(std::make_shared<std::vector<T>>(il)) { /* empty body*/ } catch (const std::bad_alloc &e) { handle_out_of_memory(e); }
判断一个调用是否是异常你一使用一元运算符noexcept(),并返回一个bool值指示是否会抛出异常。如果noexcept(true)放在一个函数后,表示此函数不会抛出异常,如果noexcept(false)放在一个函数后,表示此函数可能抛出异常。
//如果g()确定不会抛出异常,返回true,则f()确定不异常 void f() noexcept(noexcept(g()));
异常说明与指针、虚函数和拷贝控制
如果函数指针有noexcept说明符,则不能将没有noexcept声明的函数绑定到上边
如果函数指针没有noexcept说明,则可以将任何函数绑定到上边。
如果虚函数承诺了noexcept,则继承后的派生类也必须声明为noexcept
对于合成的拷贝控制成员,如果其能够确定不会抛出异常,则合成的也是noexcept
exception |
bad_alloc |
none |
logic_error |
domain_error |
|
invalid_argument |
||
out_of_range |
||
length_error |
||
runtime_error |
overflow_error |
|
underflow_error |
||
range_error |
||
bad_cast |
none |
自定义异常类
class out_of_stock : public std::runtime_error { public: explicit out_of_stock(const std::string &s) : std::runtime_error(s) { } };
//定义命名空间 namespace my_namespace { //将其他空间中的成员在这里声明 using std::cout; //命名空间别名 namespace lib = std; void Foo() { //endl没有声明,必须写完整 cout << "my namespace" << lib::endl; } //嵌套的命名空间,并且是内联的 //内联的命名空间中的成员使用时不必完整写全 inline namespace my_namespace_extends { } } class ClassName { }; //模板特例化必须在原命名空间中 namespace std { template <> struct hash<ClassName>; } //未命名的命名空间 //其中变量拥有静态声明周期,第一次使用前创建,程序结束销毁 //可以在一个文件中不连续,不能跨文件 namespace { }
函数调用时,实参的命名空间会自动引入。
class Raccoon : public virtual ZooAnimal { /* ... */ }; class Bear : virtual public ZooAnimal { /* ... */ }; class Panda :Raccoon, Bear {/* ... */};
class Panda :Raccoon, Bear { Panda(std::string name, bool onExhibit) :ZooAnimal(name, onExhibit, "Panda"), Bear(name, onExhibit), Raccoon(name, onExhibit), Endangered(Endangered::critical), sleeping_flag(false) { } };
标签:
原文地址:http://www.cnblogs.com/qiusuo/p/5154122.html