try{
可能引发异常的语句
}
catch(异常类型1){
针对异常类型1数据的处理
}
catch(异常类型2){
针对异常类型2数据的处理
}
...
异常抛出throw
#include<iostream>
int func(int x) {
if (x == -1) {
throw -1; //抛出异常
//throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型
}
if (x == 1) {
double num = 8.95;
throw num;
}
return 0;
}
int main()
{
int n=10;
try { //可能引发异常的语句--异常检测
n = func(1);
}
catch (int ex) { //异常捕获--没有异常不会执行
//根据抛出异常的数据类型进行捕获--可以是自定义类型
std::cout << "整形异常:" << ex << std::endl;
}
catch (double ex) {
std::cout << "双精度异常:" << ex << std::endl;
}
catch (...) { //捕获上面没有捕获的所有异常
std::cout << "其它异常" << std::endl;
}
std::cout << "n=" << n << std::endl;
return 0;
}
注意:如果抛出自定义class类型,catch一定要把子类放在前面,防止被截获
#include <iostream>
class A{};
class B:public A{};
void func(void) {
throw A();
}
int main()
{
try {
func();
}
catch(B& ex){
std::cout << "B异常处理" << std::endl;
}
catch (A& ex) {
std::cout << "A异常处理" << std::endl;
}
}
函数异常说明
语法:
返回类型 函数名(参数表) throw(异常类型表) { }
起个说明的作用:这个函数可能会抛出哪些类型的异常
#include <iostream>
class A{};
class B{};
void func(void) throw(A,B){ //说明func函数可能会抛出A或B异常类型
throw A();
}
int main()
{
try {
func();
}
catch(B& ex){
std::cout << "B异常处理" << std::endl;
}
catch (A& ex) {
std::cout << "A异常处理" << std::endl;
}
}
C++标准异常类exception
try{
可能引发异常的语句
}
catch(exception& ex){ //可以捕获exception所有子类类型异常对象
ex.what(); 执行相应子类的异常函数
}
自定义exception异常处理子类
#include <iostream>
class FileError :public std::exception { //异常处理类
public:
//虚函数覆盖时,子类中版本不能比基类版本抛出更多异常
virtual ~FileError(void) throw(){} //虚构函数不要抛出异常
//基类的析构函数throw()没有抛出任何异常,所以子类也不能抛出异常
virtual const char* what(void) const throw() { //对基类的what()函数进行覆盖-异常处理函数
std::cout<<"针对文件的异常处理" << std::endl; //对异常进行处理
return "FileError";
}
};
class MemoryError :public std::exception { //异常处理类
public:
//虚函数覆盖时,子类中版本不能比基类版本抛出更多异常
virtual ~MemoryError(void) throw() {} //虚构函数不要抛出异常
//基类的析构函数throw()没有抛出任何异常,所以子类也不能抛出异常
virtual const char* what(void) const throw() { //对基类的what()函数进行覆盖
std::cout << "针对内存的异常处理" << std::endl;
return "MemoryError";
}
};
int main()
{
try {
throw FileError();
}
catch (std::exception& ex) { //只需要一个catch,根据捕获的异常类型自动调用类中的what函数进行处理
std::cout << ex.what() << std::endl;
}
return 0;
}
捕获标准库异常类
try{
可能引发异常的语句
}
catch(exception& ex){
ex.what(); 执行相应的异常函数--可以看异常类型
}