C++异常捕获使用
2015-05-25 17:29
134 查看
一.异常
C语言:一般使用函数的返回值来表示是否出错.
C++语言:使用异常机制进行处理
异常语法:
(1)异常捕获
try
{
可能发生异常的语句;(调用函数语句)
}
catch(异常类型 名字)
{
异常处理语解码器
}
catch(异常类型2 名字2)
{
异常处理语句
}
//... 可以有多个catch(...)分支
(2)异常抛出
throw 异常对象(异常类型);
异常的基本用法:
(1) 抛出简单类型变量,使用异常变量的值进行区分不同的异常
(2) 抛出类类型的异常,通过异常的类型进行区分不同的异常.
(3) 从标准异常继承过来. exception
(4) 继续抛出异常,
(5) 异常说明
返回类型 函数名(形参) throw(异常类型)
{
}
注意:(1)构造函数可以抛出异常,而且在某些情况下必须抛出异常. 如果对象没有被完全构造就抛出异常, 那么所构造的对象被不完整构造,
而一个不完整的对象的析构函数是不会被调用的。
(2)最好不要在析构函数中抛出异常,如果这样可能导致程序进入不稳定状态,尽可能捕获析构函数中调用函数抛出的异常。
//自定义类型的异常处理
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; }
相关文章推荐
- 二十一天学通C++之使用try/catch捕获异常
- 二十一天学通C++之使用try/catch捕获异常
- paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH Ca6
- C++中的异常捕获与处理:Try、Throw、Catch关键字的理解和使用
- C#使用OleDb连接Excel数据源编写查询语句捕获到“无法识别的关键字when”的异常
- C++的异常抛出与捕获
- nodejs使用domain捕获工作进程异常
- android使用UncaughtExceptionHandler捕获全局异常(闪退)
- 使用Google Analytics跟踪捕获JavaScript,AngularJS,jQuery的在线错误和异常
- 【C++】try 语句捕获异常,catch子句处理异常
- 使用UncaughtExceptionhandler捕获异常,并进行重启
- 使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV
- C#调用C++库,如何捕获异常
- c++ 使用throw抛出异常
- 在 React 16 中使用高阶组件来捕获异常
- C++ 异常机制分析(C++标准库定义了12种异常,很多大公司的C++编码规范也是明确禁止使用异常的,如google、Qt)
- C++之通过引用(reference)捕获异常(12)---《More Effective C++》
- Selenium基本使用(十一)异常捕获
- JavaSE8基础 try...catch...catch 使用众多异常的父类 Exception,去捕获 其所有子类异常
- c++(1) 类模板/构造函数/捕获异常 实例