C++异常处理

C++异常处理

    • 异常处理机制
    • 异常处理基本语法
    • 注意事项
    • 异常接口声明
    • 异常类型和生命周期
      • throw普通类型
      • throw字符串类型
      • throw类类型
    • 标准程序库异常

异常处理机制

函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它可以在出现“意外”时中断当前函数,并以某种机制(类型匹配)回馈给隔代的调用者相关的信息。

异常处理基本语法

异常发生第一现场,抛出异常

void  function( ){
//... ...
  throw 表达式;
//... ...
}
在需要关注异常的地方,捕捉异常

try{
//程序
function();
//程序

}catch(异常类型声明){
//... 异常处理代码 ...
}catch(异常类型 形参){
//... 异常处理代码 ...
}catch(...){ //其它异常类型
//
}

注意事项

  1. 通过throw操作创建一个异常对象并抛掷

  2. 在需要捕捉异常的地方,将可能抛出异常的程序段嵌在try块之中

  3. 按正常的程序顺序执行到达try语句,然后执行try块{}内的保护段

  4. 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从try块后跟随的最后一个catch子句后面的语句继续执行下去

  5. catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕获并按catch子句中的代码处理异常(或继续抛掷异常)

  6. 如果没有找到匹配,则缺省功能是调用abort终止程序

  7. 处理不了的异常,我们可以在catch的最后一个分支,使用throw语法,继续向调用者throw

异常接口声明

可以在函数声明中列出可能抛出的所有异常类型,加强程序的可读性。

int copyfile2(char *dest, char *src) throw (float, string *, int)
{
	...
}
  1. 对于异常接口的声明,在函数声明中列出可能抛出的所有异常类型
  2. 如果没有包含异常接口声明,此函数可以抛出任何类型的异常
  3. 如果函数抛出声明以外的异常类型,那么可能会导致程序终止
  4. 如果一个函数不想抛出任何异常,可以使用 throw () 声明

异常类型和生命周期

C++异常处理_第1张图片

throw普通类型

throw 普通类型,和函数返回传值是一样的

void  function( ){
//... ...
  int ret = -1;
  throw ret;
//... ...
}

try{
//程序
function();
//程序

}catch(int error){
	printf("出现异常!%d", error);
}catch(...){ //其它异常类型
//
}

throw字符串类型

throw 字符串类型,实际抛出的指针,而且,修饰指针的const 也要严格进行类型匹配

void  function( ){
//... ...
  const char * error = "文件打开异常!";
  throw error;
//... ...
}

try{
//程序
function();
//程序

}catch(const char *error){
	printf("出现异常:%s", error);
}catch(...){ //其它异常类型
//
}

throw类类型

throw 类类型,最佳方式使用引用类型捕捉,抛出匿名对象,如果是动态分配的对象,直接抛出其指针
== 注意:引用和普通的形参传值不能共存! ==

class ErrorException{
	....
}

void  function( ){
//... ...
  throw ErrorException();
//... ...
}

try{
//程序
function();
//程序

}catch(ErrorException &error){
	//...
}catch(...){ //其它异常类型
//
}

标准程序库异常

C++异常处理_第2张图片
C++异常处理_第3张图片
C++异常处理_第4张图片

#include 
#include 
#include 

using namespace std;

class Student {
public:
	Student(int age) {
		if (age > 249) {
			throw out_of_range("年龄太大,你是外星人嘛?");
		}
		m_age = age;
		m_space = new int[1024 * 1024 * 100];
	}

private:
	int m_age;
	int* m_space;
};


void main() {

	try {
		//Student xioa7lang(500);
		for (int i = 1; i < 1024; i++) {
			Student* xiao6lang = new Student(18);
		}
	}
	catch (out_of_range& e) {
		cout << "捕捉到一只异常:" << e.what() << endl;
	}
	catch (bad_alloc& e) {
		cout << "捕捉到动态内存分配的异常:" << e.what() << endl;
	}

	system("pause");
}

你可能感兴趣的:(C++)