欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Essential C++ 笔记 - 第七章异常处理

程序员文章站 2022-07-13 21:45:19
...

Essential C++ 笔记 - 第七章异常处理

一、抛出异常 / 捕捉异常

void test(int i, string s){
	try {
		if(i == 0) {
			throw i;
		}
		if(s == nullptr) { 
			throw "nullptr";
		}
	}
	catch(int errno) {
		cout << "i is 0" << endl;
	}
	catch(const char* str) {
		cout << "s is nullptr" << endl;
	}
}
// 能抛出任何类型的异常
void fun (); 
// 后面括号里面是一个异常参数表,本例中能抛出这3中异常
void fun () throw(except1,except2,except3) 
// 参数表为空,不能抛出异常  
void fun () throw()

二、局部资源管理

extern Mutex m;

void f() {
	try{
		// 索求资源
		int* p = new int;
		m.accquire();
	
		process(p);

		// 释放资源
		m.release();
		delete p;
	}
	catch(...){
		m.release();
		delete p;
	}
}

三、标准异常

#include <exception>
class iterator_overflow: public exception {
public:
	iterator_overflow(int index, int max):
		_index(index), _max(max) {}
	int index() { return _index; }
	int max() { return _max; };
	
	// overides exception::what()
	const char* what() const;

private:
	int _index;
	int _max;
}
// iterator_overflow类的what()实现
#include <sstream>
#include <string>

const char* iterator_overflow::what() {
	ostringstream ex_msg;
	static string msg;
	
	ex_msg << "Internal error: current index " << _index << " exceeds maximum bound: " << _max;
	msg = ex_msg.str();

	return msg.c_str();
}

int main() {  
	try {
	    throw iterator_overflow();  
	}  
	catch(iterator_overflow& e) {
		cout << e.what() << endl;
	}
}