下面介绍如何使用异常机制来处理错误。

C++异常是对程序运行过程中发生的异常情况的一种响应。

异常提供了将控制权从程序的一部分传递到另一部分的途径。

对异常的处理有3个组成部分:

1)引发异常  ----throw

2)使用处理程序捕获异常  ---- catch

3)使用try块。  ---- try

程序在出现问题时将引发异常,例如之前的hmean(),使之引发异常,而不是调用abort()函数。

throw()语句实际上是跳转,即命令程序跳到另一条语句。

throw关键字表示引发异常,紧随其后的值指出来异常的特征。

程序使用异常处理程序(exception handler)来捕获异常,异常处理程序位于要处理问题的程序中。

catch关键字表示捕获异常。

处理程序以catch关键字开头,随后是位于括号中的类型声明,它指出了异常处理程序要响应的异常类型;

然后是用花括号括起来的代码段,指出要采取的措施。

catch关键字和异常类型用作标签,指出当异常被引发时,程序应跳到这个位置执行。

异常处理程序也被称为catch块

try块标识其中特定的异常可能被激活的代码块,它后面跟一个或多个catch块。try块是由关键字try指示的。

关键字try的后面是一个由花括号括起来的代码块,表明需要注意这些代码引发的异常

了解这三个关键字是如何协同工作的,最简单的方法是看下面一个例子:

 //error3.cpp  -- using an exception
#include <iostream>
double hmean(double a, double b); int main()
{
double x,y,z;
std::cout<<"Enter two numbers:"; while(std::cin>>x>>y)
{
try{
z = hmean(x,y);
}
catch (const char * s)
{
std::cout<< s << std::endl;
std::cout<< "Enter a new pair of numbers:";
continue;
}
std::cout<<"Harmonic mean of " << x << " and "<y
<< " is "<< z <<std::endl;
}
std::cout<<"Bye!\n";
return ;
} double hmean(double a, double b)
{
if(a == -b)
throw "bad hmean() arguments; a= -b not allowed";
return 2.0*a*b/(a+b);
}

上面那个程序,如果在try块中调用hmean(),将无法处理异常。

引发异常的语句:throw "bad hmean() arguments; a= -b not allowed"; 这个语句异常类型是字符串。

执行throw语句,类似于执行返回语句,因为它也将终止函数的执行;

但throw不是讲控制权返回给调用程序,而是将程序沿函数调用序列后退,直到找到包含try块的函数。

catch块类似于函数定义,但并不是函数定义。关键字catch表明这是一个处理程序,而 char * s 表明该处理程序与字符串的异常匹配。

s与函数参数定义极其类似,因为匹配的引发将被赋给s。

另外,当异常与该处理程序匹配时,程序将执行括号中的代码。

执行完try块后,如果没有引发任何异常,将跳过后面的catch块,直接执行处理程序后面的第一条语句。

这里可能有个疑问,如果函数引发了异常,而没有try块或者没有匹配的处理程序时,将会发生什么情况。

在默认情况下,程序最终会调用abort()函数,但可以修改这种行为。

C++_异常3-异常机制throw try catch的更多相关文章

  1. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  2. C# 中异常抛出捕获机制--throw / try,catch,finally

    try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...

  3. java:异常机制(try,catch,finally,throw,throws,自定义异常)

    * String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...

  4. 全面理解Java异常的运行机制

    1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...

  5. 第25章 SEH结构化异常处理_未处理异常及向量化异常

    25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...

  6. C# 异常捕获机制(Try Catch Finally)

    一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,fina ...

  7. [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  8. 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  9. JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?

    Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类, 并提供了良好的接口.        在 Java中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例.当一个方法出 ...

随机推荐

  1. php+mysql网站无限级栏目分类-递归获取树形结构函数

    如果网站采用了无限级栏目结构,我们可以将网站所有栏目获取出来组成一个树形结构.数据库结构: 函数代码: //获得指定文章分类的子分类组成的树形结构 function cateTree($pid=0,$ ...

  2. 由于挂载的nfs存储目录掉下线,导致创建VM时,无法创建

    具体错误,如下截图 重新挂载存储后,在创建VM,将成功

  3. Luogu 4869 albus就是要第一个出场

    BZOJ 2844 被NOIP模拟赛题弄自闭了QuQ. 因为本题要求异或,所以自然地构造出线性基,假设本题中给出的数有$n$个,而我们构造出的线性基大小为$m$,那么每一个可以异或出来的数相当于出现了 ...

  4. Oracle——分组函数

    AVG(平均值)和 SUM (合计)函数 可以对数值型数据使用AVG 和 SUM 函数. AVG组函数忽略空值 --在组函数中使用NVL函数 --求平均值 )) MIN(最小值)和 MAX(最大值)函 ...

  5. Session.Abandon-Session.Clear-Session.RemoveAll

    System.Web.UI.Page.Session属性和System.Web.HttpContext.Session属性 都是System.Web.SessionState.HttpSessionS ...

  6. 煤球数目——第七届蓝桥杯C语言B组(省赛)第一题

    原创 煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球? 请填 ...

  7. C#帮助类:MD5加密

    /// <summary> /// MD5加密 /// </summary> public class Md5 { /// <summary> /// MD5加密 ...

  8. 微信支付接入的总结 —— NATIVE & MWEB & JSAPI

    这段时间工作中需要对接微信支付,而且要多个端同时进行接入,web端,手机浏览器,微信浏览器,所以研究了下.不同场景选择合适的接入方式是必须的.https://pay.weixin.qq.com/wik ...

  9. PHP+JQuery实现ajax跨域

    jQuery实现ajax跨域 1.dataType:'jsonp'2.type: 'get'3.把要传的参数以url方式传出去  url:'http://gameapi.feiliu.com/lqzg ...

  10. 中国移动MIFI--CM510,4G TD-LTE MIFI 上网终端开箱及初步体验@上海

    上海的,前期在4G官网报名专页登记了http://www.10086.cn/lte/recruit.html 当时由于报名结束了,所以先注册登记了信息. 1.15号中午收到10086的短信邀请,立马报 ...