抛出的异常必须使用catch接收
抛出的异常可以跨函数传递
栈解旋: 当抛出异常时,同一个作用域的内容都会被销毁
#include <iostream>
#include <stdlib.h>
using namespace std;
void func1(){
int a=10;//当抛出异常会被销毁
throw(1);
}
int main(){
try{
func1();
}catch(int e){
cout << e << endl;
}
system("pause");
}
特殊语法
不能抛出任何异常
void func()throw(){}
接收任何异常
catch(...)
只能抛出指定类型异常
void func()throw(int,char*){}
处理多种类型异常
try(){
}catch(int e){
}catch(char e){
}
异常生命周期
只有当捕获异常后异常对象才析构
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
class MyErr{
public:
MyErr(string errmsg){
cout << "构造异常类" << endl;
this->errmsg=errmsg;
}
MyErr(const MyErr& err){
cout << "拷贝构造异常类" << endl;
this->errmsg=err.errmsg;
}
MyErr& operator=(const MyErr& err){
cout << "拷贝赋值异常类" << endl;
this->errmsg=err.errmsg;
return *this;
}
~MyErr(){
cout << "析构异常类" << endl;
}
public:
string errmsg;
};
void func1(){
int a=10;//当抛出异常会被销毁
throw MyErr("抛出异常");
}
int main(){
try{
func1();
}catch(MyErr e){
cout << "捕获异常" << endl;
}
system("pause");
}
运行结果:
构造异常类
拷贝构造异常类
捕获异常
析构异常类
析构异常类
继承系统异常类的自定义类对象
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stdexcept>
using namespace std;
class MyErr:public exception{
public:
MyErr(char* errmsg){
cout << "构造异常类" << endl;
this->errmsg=new char[strlen(errmsg)+1];
strcpy(this->errmsg,errmsg);
}
MyErr(const MyErr& err){
cout << "拷贝构造异常类" << endl;
this->errmsg=new char[strlen(err.errmsg)+1];
strcpy(this->errmsg,err.errmsg);
}
MyErr& operator=(const MyErr& err){
if(this->errmsg){
delete [] errmsg;
}
cout << "拷贝赋值异常类" << endl;
this->errmsg=new char[strlen(err.errmsg)+1];
strcpy(this->errmsg,err.errmsg);
return *this;
}
virtual const char * what() const{
cout << "what" << endl;
return this->errmsg;
}
virtual ~MyErr(){
cout << "析构异常类" << endl;
}
private:
char* errmsg;
};
void func1(){
int a=10;//当抛出异常会被销毁
throw MyErr("抛出异常");
}
int main(){
try{
func1();
}catch(exception e){
cout << e.what() << endl;
}
system("pause");
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-63689.html