您的位置:首页 > 编程语言 > C语言/C++

C++异常捕获使用

2015-05-25 17:29 134 查看
一.异常

C语言:一般使用函数的返回值来表示是否出错.

C++语言:使用异常机制进行处理

异常语法:

(1)异常捕获

try

{

可能发生异常的语句;(调用函数语句)

}

catch(异常类型 名字)

{

异常处理语解码器

}

catch(异常类型2 名字2)

{

异常处理语句

}

//... 可以有多个catch(...)分支

(2)异常抛出

throw 异常对象(异常类型);

//异常捕获
void config(void)
{
FILE* fpFile = fopen("a.txt","rb+");
if (fpFile == NULL)
{
cout<<"throw 之前"<<endl;
throw 100;
cout<<"throw 之后"<<endl;
}
fclose(fpFile);
};
void init(void)
{
cout<<"config调用之前"<<endl;
config();
cout<<"config调用之后"<<endl;
}

int main(void)
{
//异常捕获
try
{
cout<<"init函数调用之前"<<endl;
init();
cout<<"init函数调用之后"<<endl;
}
catch(int n)
{
if (n == 100)
{
cout<<"配置文件读取出错"<<endl;
}
}
return 0;
}


异常的基本用法:

(1) 抛出简单类型变量,使用异常变量的值进行区分不同的异常

(2) 抛出类类型的异常,通过异常的类型进行区分不同的异常.

(3) 从标准异常继承过来. exception

(4) 继续抛出异常,

(5) 异常说明

返回类型 函数名(形参) throw(异常类型)

{

}

注意:(1)构造函数可以抛出异常,而且在某些情况下必须抛出异常. 如果对象没有被完全构造就抛出异常, 那么所构造的对象被不完整构造,

而一个不完整的对象的析构函数是不会被调用的。

(2)最好不要在析构函数中抛出异常,如果这样可能导致程序进入不稳定状态,尽可能捕获析构函数中调用函数抛出的异常。

//自定义类型的异常处理

class MyException
{
private:
string m_file;	//发生异常的文件
int	   m_line;	//发生异常的行号
string m_msg;	//异常的信息.
public:
MyException(const string& file,int line,const string& msg):m_file(file),m_line(line),m_msg(msg){}
friend ostream& operator<<(ostream& os,const MyException& Ex)
{
os<<"m_file: "<<Ex.m_file<<" line: "<<Ex.m_line<<" msg: "<<Ex.m_msg;
return os;
}
};

class MemException : public MyException
{
public:
MemException(const string& file,int line,const string& msg):MyException(file,line,msg){}
};

class FileException : public MyException
{
public:
FileException(const string& file,int line,const string& msg):MyException(file,line,msg){}
};

void fun(int num)
{
if (10 == num)
{
throw FileException(__FILE__,__LINE__,"配置文件不存在");
}
else if(20 == num)
{
throw MemException(__FILE__,__LINE__,"内存溢出");
}
else
{
//如果没有匹配异常处理,系统接受,程序结束
throw 100;
}
}
int main(void)
{
<span style="white-space: pre;">	</span>try
 <span style="white-space: pre;">	</span>{
<span style="white-space: pre;">		</span>fun(30);
 <span style="white-space: pre;">	</span>}
<span style="white-space: pre;">	</span>catch(MemException& eMem)<span style="white-space: pre;">	</span>//这里的引用没有问题,异常机制帮我们处理了.
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<eMem<<endl;
 <span style="white-space: pre;">	</span>}
 <span style="white-space: pre;">	</span>catch(FileException& eFile)
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<eFile<<endl;
 <span style="white-space: pre;">	</span>}
 <span style="white-space: pre;">	</span>catch(...)<span style="white-space: pre;">	</span>//可以接受任意类型的异常.
 <span style="white-space: pre;">	</span>{
 <span style="white-space: pre;">		</span>cout<<"未知的异常"<<endl;
 <span style="white-space: pre;">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>return 0;
}


//异常说明
class CMyException : public exception
{
public:
const char* what() const throw()	//不抛出任何的异常
{
//cout<<"weikangc is good boy!"<<endl;
return "weikangc is good boy!";
}
};

//异常
void temp(int num) throw (CMyException)
{
if (66 == num)
{
//throw CMyException();
throw 66;
}
}

int main(void)
{
try
{
temp(66);
}
catch(exception& ex)
{
cout<<ex.what()<<endl;
}
catch(...)
{
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: