异常处理结构
#include<bits/stdc++.h>
using namespace std;
/**
* 异常处理
* 注意:类型必须完全匹配
* */
int main() {
cout<<"1--before try block"<<endl;
try {
cout<<"2--inside try block"<<endl;
throw 10;
cout<<"3--after throw"<<endl;
}
catch(int i) {
cout<<"4--in catch block 1 errcode is"<<i<<endl;
}
catch(char *s) {
cout<<"5-in catch block 2 errcode is"<<s<<endl;
}
cout<<"6--after catch"<<endl;
return 0;
}
在函数中处理异常
#include<bits/stdc++.h>
using namespace std;
/**
* 在函数中处理异常
* */
void temperature(int t) {
if(t == 100) {
throw "hot";
}
else if(t == 0) {
throw "cold";
}
else {
cout<<"temperature is: "<<t<<endl;
}
}
int main() {
try {
temperature(0);
temperature(10);
temperature(100);
}
catch(const char *s) {
cout<<s<<endl;
}
return 0;
}
捕获所有异常
#include<bits/stdc++.h>
using namespace std;
/**
* 捕获所有异常
* */
void errhandler(int n) throw() {
try {
if(n == 1) {
throw n;
}
if(n == 2) {
throw "dx";
}
if(n == 3) {
throw 1.1;
}
}
catch(...) {
cout<<"catch an exception"<<endl;
}
}
int main() {
errhandler(1);
errhandler(2);
errhandler(3);
return 0;
}
嵌套异常捕获
#include<bits/stdc++.h>
using namespace std;
/**
* 嵌套异常捕获
* */
void fc( ){
try{
throw "help";
}
catch (int x) {
cout<< "in fc int handler"<<endl;
}
try {
cout<<"no error handler"<<endl;
}
catch (const char *px) {
cout<<"in fc char * handler"<<endl;
}
}
void fb() {
int *q = new int(10);
try {
fc();
cout<<"return form fc(0)"<<endl;
}
catch(...) {
delete []q;
throw;
}
}
void fa() {
char *p = new char[10];
try {
fb();
cout<<"return form fb(0)"<<endl;
}
catch(...) {
delete []p;
throw;
}
}
int main() {
try {
fa();
cout<<"return form fa"<<endl;
}
catch(...) {
cout<<"in main"<<endl;
}
cout<<"end"<<endl;
return 0;
}
构造函数异常
#include<bits/stdc++.h>
using namespace std;
/**
* 构造函数异常
* */
class A {
int a;
public:
A(int i = 0):a(i) {
}
~A() {
cout<<"in a destructor"<<endl;
}
};
class B {
A obj[3];
double *pb[10];
public:
B(int k) {
cout<<"in b constructor"<<endl;
for(int i = 0; i < 10; i++) {
pb[i] = new double[20000000];
if(pb[i] == 0) {
throw i;
}
else {
cout<<"allocated 20000000 doubles in pb["<<i<<"]"<<endl;
}
}
}
};
int main() {
try {
B b(2);
}
catch (int e) {
cout<<"catch an exception when allocated pb["<<e<<"]"<<endl;
}
return 0;
}
异常类
#include<bits/stdc++.h>
using namespace std;
/**
* 异常类
* */
const int MAX = 3;
class Full {
};
class Empty {
};
class Stack {
int s[MAX];
int top;
public:
void push(int a) {
if(top >= MAX-1) {
throw Full();
}
s[++top] = a;
}
int pop() {
if(top < 0) {
throw Empty();
}
return s[top--];
}
Stack() {
top = -1;
}
};
int main() {
Stack s;
try {
s.push(10);
s.push(20);
s.push(30);
// s.push(40); // 引起栈满异常
cout<<s.pop()<<endl;
cout<<s.pop()<<endl;
cout<<s.pop()<<endl;
cout<<s.pop()<<endl;
}
catch(Full) {
cout<<"Exception Stack Full"<<endl;
}
catch(Empty) {
cout<<"Exception Stack Empty"<<endl;
}
return 0;
}
异常对象
#include<bits/stdc++.h>
using namespace std;
/**
* 异常对象
* */
const int MAX = 3;
class Full {
int a;
public:
Full(int i):a(i) {
}
int getValue() {
return a;
}
};
class Empty {
};
class Stack {
int s[MAX];
int top;
public:
Stack() {
top = -1;
}
void push(int a) {
if(top >= MAX-1) {
throw Full(a);
}
s[++top] = a;
}
int pop() {
if(top < 0) {
throw Empty();
}
return s[top--];
}
};
int main() {
Stack s;
try {
s.push(10);
s.push(20);
s.push(30);
s.push(40);
}
catch (Full e) {
cout<<"Exception:Stack Full"<<endl;
cout<<"The Value not push in stack:"<<e.getValue()<<endl;
}
return 0;
}
派生异常类
#include<bits/stdc++.h>
using namespace std;
/**
* 派生异常类
* */
class BasicException {
public:
char *Where() {
return "BasicException";
}
};
class FileSysException: public BasicException {
public:
char *Where() {
return "FileSysException";
}
};
class FileNotFound: public FileSysException {
public:
char *Where() {
return "FileNotFound";
}
};
class DiskNotFound: public FileSysException {
public:
char * Where() {
return "DiskNotFound";
}
};
int main() {
try {
throw FileSysException();
}
catch(DiskNotFound p) {
cout<<p.Where()<<endl;
}
catch(FileNotFound p) {
cout<<p.Where()<<endl;
}
catch(FileSysException p) {
cout<<p.Where()<<endl;
}
catch(BasicException p) {
cout<<p.Where()<<endl;
}
try {
throw DiskNotFound();
}
catch(BasicException p) {
cout<<p.Where()<<endl;
}
catch(FileSysException p) {
cout<<p.Where()<<endl;
}
catch(DiskNotFound p) {
cout<<p.Where()<<endl;
}
catch(FileNotFound p) {
cout<<p.Where()<<endl;
}
return 0;
}
多态捕获派生类异常
#include<bits/stdc++.h>
using namespace std;
/**
* 多态捕获派生异常类
* */
class BasicException {
public:
virtual char *Where() {
return "BasicException";
}
};
class FileSysException: public BasicException {
public:
char *Where() {
return "FileSysException";
}
};
class FileNotFound: public FileSysException {
public:
char *Where() {
return "FileNotFound";
}
};
class DiskNotFound: public FileSysException {
public:
char * Where() {
return "DiskNotFound";
}
};
int main() {
try {
throw FileSysException();
}
catch(BasicException &p) {
cout<<p.Where()<<endl;
}
try {
throw DiskNotFound();
}
catch(BasicException &p) { // 注意这里必须加引用才能体现多态和虚函数的性质,否则会调用基类的异常处理
cout<<p.Where()<<endl;
}
return 0;
}