C++语言本身或标准程序库所抛出的所有异常,都派生自基类exception。这是其他数个标准异常类别的基类,它们共同构成一个类体系:


图一 标准异常阶层体系

这些标准异常类别分为三组:

(1)语言本身所支持的异常

此类异常用以支撑某些语言特性。主要包括:
bad_alloc:new操作失败会抛出。
bad_cast:执行期间加在一个引用上面的动态性型别转换操作失败时抛出。
bad_typeid:执行RTTI时,交给typeid的参数为零或空指针时抛出
bad_exception:非预期的异常

(2)C++标准程序库发出的异常

总是派生自logic_error。逻辑错误是由于程序内部逻辑而导致的错误。逻辑错误是可以避免的,且在程序开始执行之前,能够被检测到。
C++标准库中定义的逻辑错误如下:

class logic_error : public exception {
public:explicit logic_error (const string& what_arg);
};class invalid_argument : public logic_error {
public:explicit invalid_argument (const string& what_arg);
};class out_of_range : public logic_error {
public:explicit out_of_range (const string& what_arg);
};class length_error : public logic_error {
public:explicit length_error (const string& what_arg);
};class domain_error : public logic_error {
public:explicit domain_error (const string& what_arg);
};

错误分类解释及举例:

domain_error:专业领域内的范畴

invalid_argument:无效参数,比如讲bitset以char而非0或1进行初始化

length_error:可能超越了最大极限,比如对着某个字符串附加太多字符。

out_of_range:参数不再预期范围内。例如在诸如array的容器或字符串string中采用一个错误索引。

(3)程序作用域之外发出的异常

总是派生自runtime_error,用来指出“不在程序范围内,且不容易回避”的事件。此类错误只在程序执行时才是可检测的。C++标准库中的定义如下:

class runtime_error : public exception {
public:explicit runtime_error (const string& what_arg);
};class range_error : public runtime_error {
public:explicit range_error (const string& what_arg);
};class overflow_error : public runtime_error {
public:explicit overflow_error (const string& what_arg);
};class underflow_error : public runtime_error {
public:explicit underflow_error (const string& what_arg);
};

range_error:内部计算时发生区间错误

overflow_error:算数运算时发生上溢

underflow_error:算数运算时发生下溢

实例代码:

#include <iostream>
#include <string>
#include <bitset>
#include <typeinfo>
#include <vector>
#include <stdexcept>using namespace std;//自定义配置器,vector分配空间使用
template<class _Ty>
class stingyallocator : public allocator<_Ty>
{
public:template <class U>struct rebind {typedef stingyallocator<U> other;};size_t max_size( ) const{return 10;};
};int main()
{//逻辑错误:out_of_rangetry {string str( "Micro" );string rstr( "soft" );str.append( rstr, 5, 3 );cout << str << endl;}catch ( exception &e ) {cerr << "Caught: " << e.what( ) << endl;cerr << "Type: " << typeid( e ).name( ) << endl << endl;};//逻辑错误:length_errortry{vector<int, stingyallocator< int > > myv;for ( int i = 0; i < 11; i++ )myv.push_back( i );}catch ( exception &e ){cerr << "Caught " << e.what( ) << endl;cerr << "Type " << typeid( e ).name( ) << endl << endl;};//逻辑错误:invalid_argumenttry{bitset< 32 > bitset( string( "11001010101100001b100101010110000") );}catch ( exception &e ){cerr << "Caught " << e.what( ) << endl;cerr << "Type " << typeid( e ).name( ) << endl << endl;};//逻辑错误:domain_errortry{throw domain_error( "Your domain is in error!" );}catch (exception &e){cerr << "Caught: " << e.what( ) << endl;cerr << "Type: " << typeid(e).name( ) << endl << endl;};//运行时错误:range_errortry{throw range_error( "The range is in error!" );}catch (exception &e){cerr << "Caught: " << e.what( ) << endl;cerr << "Type: " << typeid( e ).name( ) << endl << endl << endl;};//运行时错误:underflow_errortry{throw underflow_error( "The number's a bit small, captain!" );}catch ( exception &e ) {cerr << "Caught: " << e.what( ) << endl;cerr << "Type: " << typeid( e ).name( ) << endl << endl;};//运行时错误:overflow_errortry{bitset< 33 > bitset;bitset[32] = 1;bitset[0] = 1;unsigned long x = bitset.to_ulong( );}catch(exception &e){cerr << "Caught " << e.what() << endl;cerr << "Type: " << typeid(e).name() << endl << endl;}return 0;
}

运行结果(CodeBlocks):



参考资料: 

C++中异常类的使用方法

Confused about std::runtime_error vs. std::logic_error

【C++】错误处理和异常处理相关推荐

  1. php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)

    PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...

  2. MiniDump文件的创建、分析堆栈信息、定位错误、查看异常处理信息

    1.MiniDump文件的创建: 创建miniDump的方法有很多.可以通过MiniDumpCreateDumpWin32Api创建.必要参数为EXCEPTION_POINTERS结构,获取这个结构可 ...

  3. python错误-Python错误处理和异常处理

    在前面介绍Python语法的过程中,我们已经接触到了解释器给的错误和异常,但并没有详细讲解它们.现在我们就全面的来学习Python是对语法错误等错误进行定义和处理的,这包括至少有两种可以区分的错误,它 ...

  4. java程序错误类型及异常处理

    本文转载至:http://www.cnblogs.com/liaoliao/ 一.程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的.程序的设计很少有能够一次完成,没有错误的(不是指Hel ...

  5. java通过异常处理错误_java 通过异常处理错误

    1.java异常标准 在java中,Throwable这个类是所有异常或错误的父类.Throwable可以分为两种类型: error:表示编译时和系统错误,除特殊情况外,一般不用担心 exceptio ...

  6. php 异常值检测,PHP中的错误处理、异常处理机制分析

    例: $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: if(file_exists('tes ...

  7. SpringBoot 错误页面和异常处理

    一,错误页面 如图所有,这两种错误提示在springboot开发的应有程序中都很常见,第一种是html请求,第二种是json格式的请求. 在SpringBoot中,默认错误请求控制器是BasicErr ...

  8. python处理输入错误异常_Python异常处理

    (1)通过try可以避免简单的错误 data = input('请输入内容:') try : num = int(data)#如果该语句出现了错误,下面的语句不会被执行,会执行except的语句 pr ...

  9. java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径

    当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序. 可使用printStackTrace 和 getMessage方法了解异常发生的情况: printStackTrace:打印方 ...

最新文章

  1. linux线程10s没有得到调度,操作系统相关题目(附上答案)
  2. Spring中bean标签的属性和值:
  3. Core Animation放大缩小;CAKeyframeAnimation
  4. c#中结构体和类的比较
  5. 异形3×3魔方还原教程_【初级篇】(四)最简单的三阶魔方入门教程——中层还原...
  6. 结构光双目视觉测距原理
  7. Spring 全局异常捕获
  8. 面试题:ConcurrentHashMap 和 Hashtable 的区别
  9. 拼多多上线“女装11.11爆款必买团”活动 一款打底裤一天卖出4.2万单
  10. adt 22.6出现的问题
  11. 微软:攻击者利用SolarWinds Serv-U 0day发动 Log4j 攻击
  12. 按要求编写Java程序(阶乘)
  13. 利用salt防范MD5字典攻击
  14. 用JAVA编程的数字时钟代码
  15. 基于WinPcap的网络流量在线分析系统的设计与实现
  16. 运维分级发布_运维必备制度:故障分级和处罚规范
  17. js将文件大小字节转换成B,KB,MB,GB,TB方法
  18. 查看、修改数据库和表的编码格式
  19. 逻辑左移,逻辑右移,算术左移,算术右移的区分
  20. Linux 6.2:华为代码加速核心功能 715 倍!

热门文章

  1. linux内核那些事之mmap_region流程梳理
  2. 07_Influxdb+Grafana监控CPU
  3. [Unity] GameFramework 学习记录 5
  4. mysql itpub_mysql
  5. matlab算法应用论文(带代码)_左手论文 右手代码 深入理解网红算法XGBoost
  6. Mybatis(18)注解实现表名和类属性名不匹配问题
  7. caffe loss层
  8. markdown居中文本 - 代码篇
  9. 成功安装mysql后,为何服务管理器里找不到MySQL服务名(解析篇)
  10. 易优cms红色风格春节年货礼品公司网站模板源码