在设计程序时,通常程序也会出错,程序的错误可以分为三种:语法错误,逻辑错误和运行时错误
语法错误发生在编译和链接阶段
逻辑错误是我们在编写的代码思路有问题,达不到需求目标。通过调试来解决
调试方式:通过打印信息-- printf 或者 通过IDE调试跟踪查看栈信息
运行时错误是指程序在运行期间发生的错误,C语言 --- perror
在C++,为了更好运行和维护,引入异常(Exception)机制,让我们能够捕获运行时错误,给程序一次最后说话机会
1 捕获异常
在C++中,可能借助异常机制来捕获异常
1. throw ----- 扔,抛 ----将异常继续向调用者扔或者抛
2. try{
????????//正常执行的语句,但是在执行过程中,可能会抛出异常语句
????????}catch(exceptionType? ? ?val)
????????{
????????//处理异常的语句
???????? }
注意事项:
1.try和catch都是C++关键字,后跟语句块,不能省略{}
2.如果异常没有发生,它就检测不到,那么catch就会捕获不异常,该语句不会执行 3.exceptionType val类型要跟被抛出来的错误的类型要保持 一致
2 异常处理的使用
try语句正常的代码逻辑,当try语句异常时,则通过throw语句抛出异常,并退出try语句 ,catch语句处理异常情况 ? 1 当throw语句抛异常时,则会直接跳到catch语句处理 ? 2 catch语句允许被重载,try语句后面可以多个catch语句,但是,顺序要跟thorw保持一样 ? 3 不同类型的异常由不同的catch语句来捕获,顺序从上往下严格匹配,不会隐式转换 ? 4 catch(...)语句,它相当于else语句,表示捕获前面所有没有被定义的异常,且只能放在所 ? 有catch的末尾?
class Test
{
public:
void printError()const
{
cout << " error -----" <<endl;
}
};
void func()
{
// throw 1;//抛出错误的类型为int,那么由int型的catch语句来处理
//throw 1.0; //抛出错误的类型为double,那么由double型的catch语句来处理
//throw 1.5f;//抛出错误的类型为float,那么由float型的catch语句来处理
//throw "abc"; //由char const*类型的catch语句来捕获,字符串类型
//throw string("hello");//由string类型的catch语句捕获
//throw 类类型
throw Test(); //throw new Test()
}
int main()
{
try {
func();
} catch (int e) {
cout << "error:" << e<<endl;
}catch(double e){
cout << "error:" << e<<endl;
}catch(float e){
cout << "error:" << e<<endl;
}catch(char const* e){
cout << "error:" << e<<endl;
}catch(string e){
cout << "error:" << e<<endl;
}catch(const Test& e){
e.printError();
}catch(...){
cout << "other type error"<<endl;
}
return 0;
}
3 C++中 异常类
/**
* @brief Base class for all library exceptions.
*
* This is the base class for all exceptions thrown by the standard
* library, and by certain language expressions. You are free to derive
* your own %exception classes, or use a different hierarchy, or to
* throw non-class data (e.g., fundamental types).
*/
class exception
{
public:
exception() { }
virtual ~exception() ;
/** Returns a C-style character string describing the general cause
* of the current error. */
virtual const char what() const ;
};
|