#include <iostream> #include <string> using namespace std; int main(){ string str = "http://task.lmcjl.com"; char ch1 = str[100]; //下标越界,ch1为垃圾值 cout<<ch1<<endl; char ch2 = str.at(100); //下标越界,抛出异常 cout<<ch2<<endl; return 0; }运行代码,在控制台输出 ch1 的值后程序崩溃。下面我们来分析一下原因。
[ ]
不同,at() 会检查下标是否越界,如果越界就抛出一个异常;而[ ]
不做检查,不管下标是多少都会照常访问。
上面的代码中,下标 100 显然超出了字符串 str 的长度。由于第 6 行代码不会检查下标越界,虽然有逻辑错误,但是程序能够正常运行。而第 8 行代码则不同,at() 函数检测到下标越界会抛出一个异常,这个异常可以由程序员处理,但是我们在代码中并没有处理,所以系统只能执行默认的操作,也即终止程序执行。
try{
// 可能抛出异常的语句
}catch(exceptionType variable){
// 处理异常的语句
}
try
和catch
都是 C++ 中的关键字,后跟语句块,不能省略{ }
。try 中包含可能会抛出异常的语句,一旦有异常抛出就会被后面的 catch 捕获。从 try 的意思可以看出,它只是“检测”语句块有没有异常,如果没有发生异常,它就“检测”不到。catch 是“抓住”的意思,用来捕获并处理 try 检测到的异常;如果 try 语句块没有检测到异常(没有异常抛出),那么就不会执行 catch 中的语句。exceptionType variable
指明了当前 catch 可以处理的异常类型,以及具体的出错信息。我们稍后再对异常类型展开讲解,当务之急是演示一下 try-catch 的用法,先让读者有一个整体上的认识。#include <iostream> #include <string> #include <exception> using namespace std; int main(){ string str = "http://task.lmcjl.com"; try{ char ch1 = str[100]; cout<<ch1<<endl; }catch(exception e){ cout<<"[1]out of bound!"<<endl; } try{ char ch2 = str.at(100); cout<<ch2<<endl; }catch(exception &e){ //exception类位于<exception>头文件中 cout<<"[2]out of bound!"<<endl; } return 0; }运行结果:
[ ]
不会检查下标越界,不会抛出异常,所以即使有错误,try 也检测不到。换句话说,发生异常时必须将异常明确地抛出,try 才能检测到;如果不抛出来,即使有异常 try 也检测不到。所谓抛出异常,就是明确地告诉程序发生了什么错误。char ch1 = str[100000000];
,访问第 100 个字符可能不会发生异常,但是访问第 1 亿个字符肯定会发生异常了,这个异常就是内存访问错误。运行更改后的程序,会发现第 10 行代码产生了异常,导致程序崩溃了,这说明 try-catch 并没有捕获到这个异常。抛出(Throw)--> 检测(Try) --> 捕获(Catch)
#include <iostream> #include <string> #include <exception> using namespace std; int main(){ try{ throw "Unknown Exception"; //抛出异常 cout<<"This statement will not be executed."<<endl; }catch(const char* &e){ cout<<e<<endl; } return 0; }运行结果:
throw
关键字用来抛出一个异常,这个异常会被 try 检测到,进而被 catch 捕获。关于 throw 的用法,我们将在下节深入讲解,这里大家只需要知道,在 try 块中直接抛出的异常会被 try 检测到。#include <iostream> #include <string> #include <exception> using namespace std; void func(){ throw "Unknown Exception"; //抛出异常 cout<<"[1]This statement will not be executed."<<endl; } int main(){ try{ func(); cout<<"[2]This statement will not be executed."<<endl; }catch(const char* &e){ cout<<e<<endl; } return 0; }运行结果:
#include <iostream> #include <string> #include <exception> using namespace std; void func_inner(){ throw "Unknown Exception"; //抛出异常 cout<<"[1]This statement will not be executed."<<endl; } void func_outer(){ func_inner(); cout<<"[2]This statement will not be executed."<<endl; } int main(){ try{ func_outer(); cout<<"[3]This statement will not be executed."<<endl; }catch(const char* &e){ cout<<e<<endl; } return 0; }运行结果:
本文链接:http://task.lmcjl.com/news/6061.html