C++_异常7-exception类
C++异常的主要目的是为了设计容错程序提供语言级支持。
即异常使得在程序设计中包含错误处理功能更加容易,以免事后采取一些严格的错误处理方式。
异常的灵活性和相对方便性激励着程序员在条件允许的情况下在程序设计中加入错误处理功能。
总之,异常是这样一种特性,类似于类,可以改变你的编程方式。
较新的C++编译器将异常合并到语言中。
exception头文件定义了exception类。C++可以把它用作其他异常类的基类。
代码可以引发exception异常,也可以将exception用作基类
有一个名为what()的虚函数,它返回一个字符串,该字符串的特征随实现而异。
而且what()函数是一个虚方法,所以可以在基类当中重新定义它。
#include <iostream>
class bad_hmean:public std::exception
{
public:
const char * what() {return "bad arguments to hmean()";}
...
};
class bad_gmean:public std::exception
{
public:
const char * what() {return "bad arguments to gmean()";}
...
}; try{
...
}
catch(std::exception & e)
{
cout<<e.what()<<endl;
...
}
如果不想以不同的方式处理这些派生而来的异常,可以在同一个基类处理程序中捕获它们。
否则,可以分别捕获它们;
C++定义了很多基于exception类的异常;
1、stdexcept头文件的异常类
头文件stdexcept定义了其他几个异常类。首先,该文件定义了logic_error和runtime_error类。
它们都是以公有方式从exception派生而来的。
一般而言,logic_error系列异常表明存在可以通过编程修复的问题;
runtime_error系列异常表明存在无法避免的问题;
所有这些错误类有相同的常规特征,它们之间的主要区别在于:不同类名让您能够分别处理每种异常。
另一方面,继承关系能够让您一起处理它们(如果你愿意的话)。
2.bad_alloc异常和new
对于使用new导致的内存分配问题,C++最新的处理方式是让new引发bad_alloc异常。
头文件new包含bad_alloc类的声明,它是exception类公有派生而来的。
但在以前,当无法分配请求的内存量时,new返回一个空指针。
// newexcp.cpp -- the bad_alloc exception
#include <iostream>
#include <new>
#include <cstdlib>
using namespace std; struct Big
{
double stuff[];
}; int main()
{
Big * pb;
try {
cout<<"Trying to get a big block of memory:\n";
pb = new Big[];
cout<<"Got past the new request:\n";
}
catch(bad_alloc & ba)
{
cout<<"Caught the exception!\n";
cout<<"ba.what()"<<endl;
exit(EXIT_FAILURE);
}
cout<<"Memory successfully allocated\n";
pb[].stuff[]=;
cout<<pb[].stuff[] <<endl;
delete [] pb;
return ;
}
3.空指针和new
很多代码都是在new失败时返回空指针时编写的。
为处理new的变化,有些编译器提供了一个标记(开关),让用户选择所需的行为。
当前,C++标准提供了一种在失败时返回空指针的new,其用法如下
int * pi = new (std::nothrow) int;
int * pa = new (std::nowthrow) int[500];
使用这种new,可将上面程序的核心代码修改如下:
Big * pb;
pb = new(std::nothrow) Big [10000];
if(pb ==0)
{
cout<<"Could not allocate memory. Bye.\n";
exit(EXIT_FAILURE);
}
C++_异常7-exception类的更多相关文章
- Java异常基础Exception
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...
- Java基础-异常(Exception)处理
Java基础-异常(Exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常的概述 什么是异常?Java代码在运行时期发生的问题就是异常.在Java中,把异 ...
- java异常继承何类,运行时异常与一般异常的区别
一.基本概念 Throwable是所有异常的根,java.lang.ThrowableError是错误,java.lang.ErrorException是异常,java.lang.Exception ...
- 每天一点点java---继承exception类来实现自己的异常类
package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类 ...
- Java -- 异常的捕获及处理 -- Exception类与RuntimeException类
7.3 Exception类与RuntimeException类 Exception类与RuntimeException类的联系与区别??? 例:字符串变为整型 Class : RuntimeExce ...
- Java异常 Exception类及其子类
C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...
- 网易云课堂_C++程序设计入门(下)_第9单元:白公曾咏牡丹芳,一种鲜妍独“异常”_第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理
第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前 ...
- Visual C++ 异常(Exception)常见问题 (原文标题:A Visual C++ Exception FAQ)
Visual C++ 异常(Exception)常见问题 版权:Doug Harrison 2001 – 2007 翻译:magictong(童磊) 2011年3月 原文地址:http://membe ...
- muduo网络库源码学习————Exception类
Exception类是为异常捕获而设计,可以获得异常的信息以及栈的回溯信息 (原来的代码没有demangle成员函数,输出的格式比较难看,加了demangle成员函数,利用demangle成员函数可以 ...
随机推荐
- SQLSERVER索引在什么情况下会失效
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...
- YII2 模型关联之 一对多
需求,一个用户有多篇文章全部查询出来 文章表 用户表 //首先查找出一个用户出来 $user=Users::find()->'])->one(); //第一个参数还是关联的模型,第二个依旧 ...
- Docker 学习笔记_安装和使用MongoDB
一.准备 1.宿主机OS:Win10 64 2.虚拟机OS:Ubuntu18.04 3.账号:docker 二.安装 1.搜索MongoDB镜像 ...
- MySQL - pt-query-digest的下载与使用
对于脚本文件,是可以执行的,我们不用安装.所以,但是这个脚本文件没有执行的权限,所以,我们首先赋予这个脚本文件的可执行的权限. 再次查看文件的信息后. 已经有了执行的权限了. 运行脚本的时候,可要注意 ...
- libcurl用法
本文以向百度搜索开放平台搜索关键字所对应的推荐搜索条目为例子: url:http://m.baidu.com/su?wd=%s&action=opensearch&ie=utf-8 ( ...
- Linux gtypist
一.简介 Typist (gtypist)是一个打字练习软件,用来提升打字的速度. 二.安装 1)源码方式 http://ftp.gnu.org/gnu/gtypist/ 三.使用 http: ...
- jQuery--后台主机列表编辑
先看效果: 要求: 全选,反选和取消 编辑模式下的全选,反选和取消 编辑模式下单选进入编辑状态,取消退出编辑状态 表格元素有可编辑,不可编辑,下拉选择 按住ctrl选择下拉框,下面的同列选项都随之改变 ...
- scala的futue和promise
异步操作的有两个经典接口:Future和Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这个结果可以添加 Callback 以便在任务执行成功或失败后做出对应的操 ...
- MFC可视化
当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE):如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE ...
- Diameter协议摘要
---------选择同学整理文档 1. 协议概述 Diameter协议主要为应用程序提供认证.鉴权.计费框架,即AAA,并支持本地AAA和漫游场景下的AAA. 1.1. 特点介绍 以前的AAA ...