C++ try-catch语法分析与应用

这篇具有很好参考价值的文章主要介绍了C++ try-catch语法分析与应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3 try-catch语法分析

通过前面的学习,我们了解了try-catch语法的基本使用。但是,C++提供的异常处理机制很全面,下面再具体分析。

发生异常的时候,我们可以主动抛出一个异常,所以,使用throw抛出一个异常。异常可以是一个数值,字符,或者表达式。

抛出的异常可以有try-catch语句捕获。try-catch的语法结构如下:

try-catch的结构为

try

{

被检查的语句

}

catch(异常信息类型[变量名])

{

进行异常处理的语句

}

归纳总结如下:

(1) 被检测的异常代码必须放在try块中,捕获不到异常。

(2) try块和catch块作为一个整体出现,catch块数try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句,例如下面的用法不对:

try

{

....

}

cout << "www.mylinux.vip" << endl; //不能插入其他语句

catch(double)

{

....

}

在一个try-catch结构中,可以只有try块而无catch块。那么,就捕获捕获到抛出的异常信息。

(3) try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。

(4) 一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配,如:

try

{ ... }

catch(double)

{ ... }

catch(int)

{ ... }

catch(char)

{ ... }

(5) catch后面的圆括号中,一般只写异常信息的类型名,如:

catch(double)

catch只检查所捕获异常信息的类型,而不检查它们的值,例如,a, b, c都是 double 类型,虽然它们的值不同,但在throw语句中写throw a, throw b 或 throw c,作用均相同。因此,如果需要检测多个不同的异常信息,应当由throw抛出不同类型的异常信息。

异常信息可以是C++系统预定义的标准类型,也可以说用户自定义的类型(如结构体或类)。如果由throw抛出的信息属于该类型或其子类型,则catch与throw二者匹配,catch捕获该异常信息。

catch还可以有另外一种写法,即除了指定类型名之外,还指定变量名,如:

catch (double e)

此时,如果throw抛出的异常信息是double类型的变量a,则catch在捕获异常信息a的同时,还使得d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?有时候希望在捕获异常信息的时候,还能利用throw抛出的值,如:

catch (double e)

{

cout << "throw err = " << e << endl;

}

这时会输出e的值就是抛出的异常信息,有时希望在catch块中显示该对象中的某些信息。这时就需要在catch的参数中写出变量名(类对象名)。

(6) 如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕捉任何类型的异常信息,如:

catch (...)

{

cout << "catch all err" << endl;

}

它能捕获所有类型的异常信息。

这种catch子句应放在try-catch结构中的最后,相当于“其他”。如果把它作为第一个catch子句,则后面的catch子句都不起作用。

(7) try-catch结构可以与throw出现在同一个函数中,也可以不在同一函数中。当throw抛出异常信息之后,首先中本函数中选择与之匹配的catch,如果在本函数中无try-catch结构或找不到与之匹配的catch,就转到其上一层去处理,如果其上一层也无try-catch结构,或找不到与之匹配的catch,则再转到更上一层的try-catch结构去处理,也就是说,总是转到离开出现异常最近的try-catch结构去处理。当最近的处理不了,再往上传递异常。

(8) 在某些情况下,在throw语句中可以不包括表达式,如:

throw;

表示“我不处理这个异常,请上级处理”。此时,它将把当前在处理的异常信息再次抛出,给其上一层的catch块处理。如:

catch(...)

{

.....

throw; //将已捕获的异常信息再次原样抛出,由上一层的catch处理器处理

}

(9) 如果throw抛出的异常信息找不到与之匹配的catch块,那么,系统就会调用一个系统函数terminate,使程序终止运行。

4 try-catch应用

通过前面的学习,我们掌握了try-catch捕获异常的基本方法。但是,C++提供的异常处理机制很完善,可以考虑多种异常的情况。那么,可以总结如下:

(1) 一个函数可以throw抛出多个异常,try-catch可以使用多个catch捕获不同类型的异常。

程序测试代码如下:

trycatch语法,Linux 系统编程课程,Linux C 程序设计课程,Linux C++程序设计课程,c++,java,开发语言,Powered by 金山文档

程序运行结果如下:

trycatch语法,Linux 系统编程课程,Linux C 程序设计课程,Linux C++程序设计课程,c++,java,开发语言,Powered by 金山文档

可以看到,在add()函数中throw多个异常信息。然后,在try后面有2个catch语句块。当执行t.add(11)的时候,就在add()函数中执行 throw 12689;语句,抛出12689消息。

此时,马上结束try中的语句块,不再执行接下来的t.add(16);等语句。直接跳转到catch()语句块中。

此时,抛出的12689消息是一个int类型的数值,所以,提交给catch(int e)捕获,捕获一个int类型的消息。

在进行异常处理后,程序并不会自动终止,继续执行catch子句后面的语句。文章来源地址https://www.toymoban.com/news/detail-597037.html

到了这里,关于C++ try-catch语法分析与应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

    目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL:Look Before You Leap EAFP: It\\\'s Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws  try-catch捕获处理 finally的作用 四.自定义异常类 有一句话说的很好 ”程序员不是在写BUG就是在改BUG”

    2024年02月05日
    浏览(33)
  • 面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!

    面试官: try-catch 到底写在循环里面好,还是外面好? 这个问题,我相信大部分人都会答错! 很多人会说当然写在循环外面好,也有一部分人说写在循环里面好,其实这两种回答都不完全对,我们来分析下两者的弊端。 try-catch 写在循环外面的弊端: 如果 try-catch 写在循环外

    2024年02月16日
    浏览(30)
  • try catch执行过程分析

    本篇文章带大家聊聊try catch的执行过程,有时候在开发的过程中,try代码里如果出现异常,catch后的步骤还会继续执行吗?以及finally的使用。 下面来分析一下几种使用场景: 场景一: try代码块中出现异常后,系统会继续执行catch代码块的程序。catch代码块外的代码也会继续被

    2024年02月15日
    浏览(33)
  • 前端try和catch

    为什么要使用try catch 使用 try...catch 语句是为了处理和管理可能会在程序运行过程中发生的异常或错误情况。以下是一些使用 try...catch 的主要原因: 错误处理:在开发过程中,无法避免地会出现各种错误,如网络请求失败、数据解析错误、未定义的变量引用、不合法的操作等

    2024年02月07日
    浏览(29)
  • try、catch语句解析

    try-catch 语句是JavaScript中的一种 处理异常 的方式。 它的执行规则如下:首先会执行try中的代码,如果异常则会通过throw抛出异常,而catch会捕获抛出的异常。 在代码执行过程中,如果遇到错误会立即停止执行,转而进入catch语句当中。 在 try-catch 语句中,二者都是可选择的。

    2024年02月15日
    浏览(29)
  • try catch 嵌套

    在单元测试中写入以下方法: testMain() 主方法, out() 里面嵌套了两层try catch 异常代码写在内层try中 示例一: 日志信息: 可以看到,内层try中的异常由 内层catch处理 了,外层catch并未处理,主方法后续业务逻辑并未受到影响,可正常执行. 示例二: 内层try catch中添加 throw new Ru

    2024年02月06日
    浏览(28)
  • C# try catch 使用

    try catch使用场景: 1. 一般在线程,委托中使用, 在线程与委托中使用是因为,如果线程和委托中出现异常在程序外部是捕获不到的,需要在内部做单独处理。 2. 程序的外层使用,比如程序的入口处加一个全局异常捕获,这样整个程序发生的异常都可以捕获到。 3. 在事件或

    2024年02月09日
    浏览(33)
  • Java try catch语句详解

    在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。 Java 的异常处理机制可以让程序具有极好的

    2024年02月08日
    浏览(31)
  • 记录--try...catch知识补全

    说到 try...catch 都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上: try...catch 只能捕捉到同步执行代码块中的错误 。 题目是:以下代码有错吗?如果有错,应该如何改正? 反正就是不

    2024年02月04日
    浏览(32)
  • 深入理解try...catch(字节码层面)

    我们工作中常用try...catch来解决程序中出现的异常情况,但是你真的了解它的实现原理吗?今天我就带着大家从字节码层面理解try...catch 我们首先需要准备好异常类和对应的测试类方便我们观察。 异常类: 测试类: 在idea中编译后,使用jclasslib插件即可查看对应的字节码,字

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包