#include "stdafx.h"

#include <iostream>
#include <stdlib.h>
using namespace std; //定义一个错误类
class RangeException{
public:
const char* range_error;
RangeException(const char* s):range_error(s){}
}; double Fuc(double x, double y){
if(y == ){
throw RangeException("error of dividing zero.\n"); //抛出一个错误
}
return x/y;
} void main()
{
double res;
try{
res = Fuc(,);
cout << "The result of x/y is : " << res << endl;
res = Fuc(,);
}
catch(RangeException e){ //捕捉到一个错误e
cerr << e.range_error;
cin >> res;
exit();
}
cin >> res;
}

显示结果:

当抛出的错误类中有构造函数和析构函数的时候会发生下面这样的情况。在下面的代码中,ExceptionClass是一个类,它的构造函数以一个字符串做为参数。也就是说,在throw的时候,C++的编译器先构造一个ExceptionClass的对象,让它作为throw的值抛出去。同时,程序返回,调用析构。

#include "stdafx.h"
#include <iostream>
using namespace std; class ExceptionClass{
const char* name;
public:
ExceptionClass(const char* name = "default name"){
cout << "Construct " << name << endl;
this->name = name;
}
~ExceptionClass(){
cout << "Destruct " << name << endl;
}
void mythrow(){
throw ExceptionClass("my throw");
}
}; void main(){
ExceptionClass e("Test");
try{
e.mythrow();
}
catch(...){
cout << "*********" << endl;
}
}

显示的结果是:

Construct Test
Construct my throw
Destruct my throw
****************
Destruct my throw   (这里是异常处理空间中对异常类的拷贝的析构)
Destruct Test

也就是说这里还存在一个对异常类的拷贝操作。

============================================================================================

如果有多个错误类型,那么catch语句可以这样写:

void Func()
{
try
{
// 这里的程序代码完成真正复杂的计算工作,这些代码在执行过程中
// 有可能抛出DataType1、DataType2和DataType3类型的异常对象。
}
catch(DataType1& d1)
{
}
catch(DataType2& d2)
{
}
catch(DataType3& d3)
{
}
// 注意上面try block中可能抛出的DataType1、DataType2和DataType3三
// 种类型的异常对象在前面都已经有对应的catch block来处理。但为什么
// 还要在最后再定义一个catch(…) block呢?这就是为了有更好的安全性和
// 可靠性,避免上面的try block抛出了其它未考虑到的异常对象时导致的程
// 序出现意外崩溃的严重后果,而且这在用VC开发的系统上更特别有效,因
// 为catch(…)能捕获系统出现的异常,而系统异常往往令程序员头痛了,现
// 在系统一般都比较复杂,而且由很多人共同开发,一不小心就会导致一个
// 指针变量指向了其它非法区域,结果意外灾难不幸发生了。catch(…)为这种
// 潜在的隐患提供了一种有效的补救措施。
catch(…)
{
}
}

============================================================================================

使用异常规格编程
如果我们调用别人的函数,里面有异常抛出,用去查看它的源代码去看看都有什么异常抛出吗?这样就会很烦琐。比较好的解决办法,是编写带有异常抛出的函数时,采用异常规格说明,使我们看到函数声明就知道有哪些异常出现。

============================================================================================

转:

1. http://blog.sina.com.cn/s/blog_a9303fd901018ost.html

2. http://blog.csdn.net/codestinity/article/details/6877581

try throw catch的更多相关文章

  1. c++ try throw catch

    c++ try throw catch 这三者联合使用 , try { statement list; } catch( typeA arg ) { statement list; } catch( ...

  2. C++中的try throw catch 异常处理

    今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,ca ...

  3. try throw catch异常处理机制

    /*本程序实现分块查找算法  又称索引顺序查找     需要注意的是分块查找需要2次查找  先对块查找  再对块内查找    2013.12.16    18:44*/ #include <io ...

  4. try throw catch typeid

    QString str = ui.ll->text(); try { if (str == NULL) { throw 1; } else { throw 1.2; } } catch (int ...

  5. 132.try throw catch介绍

    #include <iostream> using namespace std; //try尝试执行,抛出throw,throw之后语句不再执行 //catch处理throw的异常 voi ...

  6. C#中try catch中throw ex和throw方式抛出异常有何不同

    我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...

  7. 【又长见识了】C#异常处理,try、catch、finally、throw

    异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常.处理这种错误,就叫做异常处理. 1.轻描淡写Try.Catch.Finally.throw用法 在异常处理中,首先需要对可能发 ...

  8. C++的异常处理之一:throw是个一无是处的东西

    看这篇文章学习C++异常处理的基础知识.看完后,还不过瘾,为什么大家在C++代码中都不用Exception?为什么C++11会引入一些变化? 为什么C++ exception handling需要un ...

  9. [转] c++ try catch 问题

    windhaunting,原文地址 以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: ...

随机推荐

  1. javascript 函数声明与函数表达式的区别

    先看一段代码 var f = function g() { return 1; }; if (false) { f = function g(){ return 2; }; } alert(g()); ...

  2. MAC中查看Python安装路径

    [admin@admindeMac:~]which  Python /usr/bin/Python

  3. springMvc的第一个demo

    1.下载jar包 http://repo.spring.io/libs-release-local/org/springframework/spring/4.2.3.RELEASE/ 2.下载源码 j ...

  4. python 2.7 和3.0input区别

    name = raw_input('请输入用户名:')#python2.7的用法 name = input('请输入用户名:')#python3.0的用法 print(name)

  5. [转]Mybatis出现:无效的列类型: 1111 错误

    原文地址:http://www.cnblogs.com/sdjnzqr/p/4304874.html 在使用Mybatis时,不同的xml配置文件,有的会提示:无效的列类型: 1111 比如这个sql ...

  6. iOS开发小技巧--TextField的细节处理,键盘中return键的处理

    一.TextField取消自动纠错和设置自身对应键盘的return键盘的样式 二.程序运行过程中,监听return键点击,实现相应操作

  7. 【BZOJ 1176】【Balkan 2007】Mokia

    http://www.lydsy.com/JudgeOnline/problem.php?id=1176 整体二分的例题 把每个询问拆成四个询问,整体二分里x坐标递增,按x坐标扫的时候用树状数组维护y ...

  8. JDK历史版本下载

    JDK6: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409. ...

  9. lucene-查询query->PhrasePrefixQuery使用短语缀搜索

    PhrasePrefixQuery与Phrase有些类似.在PhraseQuery中,如果用户想查找短语“david robert”,又想查找短语“mary robert”.那么,他就只能构建两个Ph ...

  10. windows系统激活-使用微软官方公布的kms client setup key安装或安装后使用slmgr导入

    windows 10各版本: Windows 10 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX Windows 10 Professional N MH37W ...