c++异常处理的方法

c++异常处理

程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在等等。

这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。

所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。

C++ 引入了异常处理机制。其基本思想是:函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。

拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。

如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。

C++异常处理基本语法

C++ 通过 throw 语句和 try...catch 语句实现对异常的处理。throw 语句的语法如下:

该语句拋出一个异常。异常是一个表达式,其值的类型可以是基本类型,也可以是类。

catch 可以有多个,但至少要有一个。

不妨把 try 和其后{}中的内容称作“try块”,把 catch 和其后{}中的内容称作“catch块”

try...catch 语句的执行过程是:执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。

例如下面的程序:

程序的运行结果如下:

说明当 n 不为 0 时,try 块中不会拋出异常。因此程序在 try 块正常执行完后,越过所有的 catch 块继续执行,catch 块一个也不会执行。

程序的运行结果也可能如下:

当 n 为 0 时,try 块中会拋出一个整型异常。拋出异常后,try 块立即停止执行。该整型异常会被类型匹配的第一个 catch 块捕获,即进入catch(int e)块执行,该 catch 块执行完毕后,程序继续往后执行,直到正常结束。

如果拋出的异常没有被 catch 块捕获,例如,将catch(int e),改为catch(char e),当输入的 n 为 0 时,拋出的整型异常就没有 catch 块能捕获,这个异常也就得不到处理,那么程序就会立即中止,try...catch 后面的内容都不会被执行。

以上就是c++异常处理的方法的详细内容

原文地址:https://www.cnblogs.com/IT-SUJIU/p/11728982.html

时间: 2024-10-24 17:05:30

c++异常处理的方法的相关文章

ASP.NET mvc异常处理的方法

第一种:全局异常处理 1.首先常见保存异常的类(就是将异常信息写入到文件中去) C# 代码   复制 public class LogManager { private string logFilePath = string.Empty; public LogManager(string logFilePath) { this.logFilePath = logFilePath; FileInfo file = new FileInfo(logFilePath); if (!file.Exist

MVC3异常处理的方法

1.采用内置的HandleErrorAttribute对象,跳转到指定错误页 示例:http://www.cnblogs.com/TomXu/archive/2011/12/15/2285432.html 2.实现IExceptionFilter过滤器接口 其实方法1中也是实现的IExceptionFilter接口.但此方法中可以对异常信息进行处理,如记录异常日志.跳转到指定页面等 2.1 创建一个BaseController类,集成于Controller类,并实现IExceptionFilte

PHP程序异常处理实现方法

一个异常(Exception)则是在一个程序执行过程中出现一个例外或是一个事件,它中断了指令的运行,跳转到其他程序模块继续执行.所以异常处理经常被当作程序的控制流程使用.无论是错误还是异常,应用程序都必须能够以妥善的方式处理,并做出相应的反映,希望不要丢失数据或者导致程序崩溃.异常处理用于在指定的错误发生时改变脚本的正常流程,是PHP5中的一个新的重要特性.异常处理是一种可扩展.易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式.在Java.C#及Python等语言中很早就提供了这

ASP.NET mvc异常处理的方法示例介绍

www.zongheng.com/chapter/57162/1277769.htmlwww.zongheng.com/chapter/57162/7246695.htmlwww.zongheng.com/chapter/57162/7246702.htmlwww.zongheng.com/chapter/57162/7246703.htmlwww.zongheng.com/chapter/57162/7246704.htmlwww.zongheng.com/chapter/57162/7246

Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转载

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法,下面一起来看看. python3 抓取网页资源的 N 种方法 1.最简单 import urllib.requestresponse = urllib.request.urlopen('http://python.org/')html = res

C#异常处理经验(原则与方法)

本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验.   1.什么时候该异常处理? 1)代码最外层,如WinFrom,避免用户看到内部异常信息用户体验不好,或者造成程序崩溃,可以用log4net之类的框架记录异常. 2)遇到异常需要恢复状态或者重试的地方.例如连接数据库偶然失败了,可以有个重连机制,在Catch块重新连接数据库. 3)对于一系列有可能失败的任务,其中有

【转】Python3中urllib详细使用方法(header,代理,超时,认证,异常处理)

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法,下面一起来看看. python3 抓取网页资源的 N 种方法 1.最简单 1 import urllib.request 2 3 response = urllib.request.urlopen('http://python.org/') 4

Python3中urllib详细使用方法(header,代理,超时,认证,异常处理)

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法,下面一起来看看. python3 抓取网页资源的 N 种方法 1.最简单 1 import urllib.request 2 3 response = urllib.request.urlopen('http://python.org/') 4

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的