上篇文章中我们简单了解了C和C++中异常处理的不同方式。显然C++中提供的异常处理的功能给我们的编程带来了很大的方便,让我们从处理错误的复杂逻辑中解脱出来,也让我们的代码更加清晰。从这篇文章开始我们就来具体介绍一下C++中的异常处理。
一、抛出异常
如果在程序代码中出现了一些异常情况, 程序员可以创建一个包含错误信息的对象并把它抛出当前语境,这种方法被称为“抛出异常”。
class
Error
... {
public:
Error(const char* msg):message(msg)...{};
private:
const char* message;
} ;
void f()
... {
//这里我们抛出一个异常对象
throw Error("something error!");
}
int main()
... {
f();
}
... {
public:
Error(const char* msg):message(msg)...{};
private:
const char* message;
} ;
void f()
... {
//这里我们抛出一个异常对象
throw Error("something error!");
}
int main()
... {
f();
}
在上面的代码中,Error是一个普通的类,它的构造函数接受一个char* 类型的变量作为参数。在抛出一个异常时,可以使用任意的类型,但通常应当为抛出的异常创建特定的类。
关键字throw将导致一系列事件发生:
1).创建程序所抛出的对象的一个拷贝;
2).包含throw表达式的函数返回了这个对象,即使该函数原来并未声明为返回这种对象类型,这其实是一种交错返回机制(alternate return mechanism).
3).异常会造成程序返回到某个地方,其实就是返回到异常处理器的代码段;
4).异常发生前创建的局部对象被销毁,这种对局部对象的自动清理通常被称为“栈反弹”。
在实际操作中,程序员可以创建不同类型的对象以便在每种不同的异常情况下抛出。这样就可以将错误信息保存在相应的对象和对象类名中,调用者根据这些信息就可以决定应该如何处理这些异常了。