`

C++巩固与知新----异常处理

    博客分类:
  • C++
 
阅读更多

异常处理

1.throw表达式:错误检测部分使用这种表达式来说明遇到了不可处理的错误,可以说throw引发了异常条件。

2.Try块:以try开始,以一个或者多个catch结束,对于try块中处理的代码抛出的异常,catch会进行处理。

基本结构:

try
{
//程序中抛出异常
throw value;
}
catch(valuetype v)
{
//例外处理程序段
}<!--EndFragment-->

基本解释如下:

try包含你要防护的代码 ,称为防护块防护块如果出现异常,会自动生成异常对象并抛出.

catch捕捉特定的异常,并在其中进行适当处理.

throw可以直接抛出/产生异常,导致控制流程转到catch.

说明:

(1)trycatch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;(2)trycatch必须成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异常信息匹配;(3)如果在catch块中没有指定异常信息的类型,而用删节号"...",则表示它可以捕获任何类型的异常信息;(4)如果throw不包括任何表达式,表示它把当前正在处理的异常信息再次抛出,传给其上一层的catch来处理;(5)C++中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序;

说明部分转自:http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/19/2145349.html

 

其实,也可以自定义exception或者unexception

具体可以参考http://blog.csdn.net/makenothing/article/details/43273137

 

最后上一段代码,一个经典的例子展示异常处理的重要性:

代码1:

<!--EndFragment-->

#include<iostream>
using namespace std;
double fuc(int x, int y)                        //定义函数
{
 if (y == 0)
 {
  throw y;                                    //除数为0,抛出异常int
 }
 return x / y;                                    //否则返回两个数的商
}
void main()
{
 int res,a;
 while (true)
 {
  cin >> a;
  try                                            //定义异常
  {

   res = fuc(2, a);
   cout << "The result of x/y is : " << res << endl;
  }
  catch (int)                                    //捕获并处理异常
  {
   cerr << "error of dividing zero.\n";
   system("pause");
   exit(1);                                    //异常退出程序
  }
  }
}

输入:0

输出:error of dividing zero.

代码2:自定义exception、unexpection、terminate

#include<iostream>
#include<exception>
using namespace std;

//自定义exception类
class Myexception : public exception
{
public:
 const char* what() const throw()
 {
  return "error!";
 }
};
void myUnexpected()
{
 cout << "Unexpected exception caught!\n";
 system("pause");
 exit(-1);
}
void myTerminate() //##1 set it be the terminate handler   
{
 cout << "Unhandler exception!\n";
 system("pause");
 exit(-1);
}
//将异常抛出封装在一个函数里。若后面接throw(...)则...代表允许抛出的异常类型,
//若无则表示不允许抛出异常,系统进入unexpection

//若后面什么都没有,则表示可以接受任何的异常处理
void check(int x){
 if (x == 0)
 {
  throw Myexception();
 }
}
int main()
{
 unexpected_handler oldHandler = set_unexpected(myUnexpected);
 terminate_handler preHandler = set_terminate(myTerminate);
 int x = 100, y = 0;
 try
 {
  check(y);
  cout << x / y;
 }
 catch (Myexception &e) //no catch sentence matches the throw type   
 {
  cout << e.what << endl;
 }
 catch (...)
 {
 //处理未知的异常
  cout << "unknown error!" << endl;
 }
 system("pause");
 return 0;
}

结果自然是error!

<!--EndFragment--><!--EndFragment-->
1
2
分享到:
评论

相关推荐

    C++相关的书籍

    Herb Sutter的这本书深入讨论了C++中的异常处理和错误处理策略,适合想要提升代码质量的开发者。 8. 《C++编程规范》 - Herb Sutter,Andrei Alexandrescu(作者),刘基诚(译者) 这是一本关于C++编码风格和最佳...

    c++必知必会pdf简体中文版

    4. 异常处理:异常处理是C++语言用于处理程序运行中出现的异常情况的一种机制。本书对如何在C++中合理使用异常处理进行了详细的解释和示范。 5. 内存分配:内存管理是C++程序员必须精通的领域之一。本书介绍了C++中...

    C++必知必会中文版.rar

    C++的发展是在C语言的基础上进行的,保留了C语言的大部分特性,并加入了类、模板、异常处理等面向对象的特性。 在《C++必知必会》这本书中,你将学习到以下关键知识点: 1. **基础语法**:包括变量、数据类型、...

    C++黑客编程揭秘与防范 光盘

    第六章可能涉及到更高级的C++编程技巧和安全实践,例如内存管理、对象生命周期和异常处理。 3. chapter4:第四章的资料,可能涵盖C++的类和对象、继承与多态性等面向对象编程的关键主题,同时也会讨论如何防止这些...

    《C++必知必会》电子书

    5. **异常处理**:讲解异常处理机制的基本原理和最佳实践,帮助开发者编写更健壮的代码。 6. **高级特性**:包括模板元编程、lambda表达式、右值引用等C++11及以后版本引入的新特性。 7. **性能优化技巧**:提供一...

    c++源代码整理

    1. **C++必知必会.pdf**:这本书籍可能涵盖了C++的基础概念、语法、类和对象、模板、异常处理、STL(标准模板库)等核心内容。学习者可以通过它系统地了解C++的基础知识,包括变量、运算符、流程控制语句、函数、...

    C++基础知识讲义v1

    10. **C++_unit10異常處理**: 异常处理是处理程序运行时可能出现的错误或异常情况的方法,如try-catch块的使用,以及如何自定义异常。 11. **C++_unit11標準模板庫(STL)**: STL是C++标准库的一部分,包含容器(如...

    C++学习资料

    - 异常处理:学习try、catch和throw关键字来处理程序运行时的异常情况。 6. C++11及新标准特性 - auto类型说明符:理解auto关键字如何自动推断变量类型。 - lambda表达式:学习lambda表达式的定义和使用。 - ...

    2021 CCF非专业级别软件能力认证第一轮 (CSP-S)提高级 C++B卷试题答案及解详细析.rar

    此外,题目也可能包含一些特定的编程挑战,如文件操作、内存管理、异常处理等,这些都是实际编程项目中常见的问题。解决这些问题需要对C++的高级特性有深入的理解。 对于每一道试题,详细的解答不仅会给出正确答案...

    Visual C++课程设计案例精编 严华峰版 源代码

    5. **异常处理**:C++的异常处理机制是程序错误处理的重要部分。源代码中可能包含try、catch和throw语句的使用,以及自定义异常类的实现,帮助你在遇到错误时能够优雅地恢复程序运行。 6. **内存管理**:C++提供了...

    ObjectARX.rar

    1. **C++基础**:ObjectARX是用C++编写的,因此对C++的基本语法、类、对象、模板、异常处理等要有深入理解。 2. **面向对象编程**:C++是一种面向对象的语言,ObjectARX利用这一点,开发者需要理解继承、封装和多态...

    JNI教程大全集,android开发必看!绝对经典!

    JNI教程会详细解释如何在C/C++中实现这些本地方法,包括如何访问Java对象,调用成员变量和方法,以及处理异常。 4. **数据类型转换**:JNI提供了Java与C/C++数据类型的映射,例如如何将Java的`String`转化为C的`...

Global site tag (gtag.js) - Google Analytics