C++ 异常,标准异常类,自定义异常类,throw,try,catch语句

要学习异常,首先就要学习throw和try,catch语句:

C++中try catch语句用法有非常灵活,有许多种组合;

这里简单介绍以下最基本的用法;

1. 格式

try{
...
}
catch{
...
}

try语句块是用来判断是否有异常;

catch语句块捕捉异常,并进行处理;

throw是抛出异常;

2. 实例

 

首先通过一个简单的例子来熟悉C++ 的 try/catch/throw(可根据单步调试来熟悉,try catch throw部分是如何运行的):

#include <iostream>  
#include <exception>  
using namespace std;  
int main () {  try  {  throw 1;  throw "error";  }  catch(char *str)  {  cout << str << endl;  }  catch(int i)  {  cout << i << endl;  }  
}
#include <stdlib.h>
#include "iostream"
using namespace std;double fuc(double x, double y)                        //定义函数
{if(y==0){throw y;                                    //除数为0,抛出异常}return x/y;                                    //否则返回两个数的商
}int _tmain(int argc, _TCHAR* argv[])
{double res;try                                            //定义异常{res=fuc(2,3);cout<<"The result of x/y is : "<<res<<endl;res=fuc(4,0);                                //出现异常}catch(double)                                    //捕获并处理异常{cerr<<"error of dividing zero.\n";exit(1);                                    //异常退出程序}return 0;
}

 

 

【注】:catch 的数据类型需要与throw出来的数据类型相匹配的。

catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常对象更好的控制手段,使开发的软件系统有很好的可靠性。因此一个比较有经验的程序员通常会这样组织编写它的代码模块,如下:

void Func()
{try{// 这里的程序代码完成真正复杂的计算工作,这些代码在执行过程中// 有可能抛出DataType1、DataType2和DataType3类型的异常对象。}catch(DataType1& d1){}catch(DataType2& d2){}catch(DataType3& d3){}/*********************************************************注意上面try block中可能抛出的DataType1、DataType2和DataType3三种类型的异常对象在前面都已经有对应的catch block来处理。但为什么还要在最后再定义一个catch(…) block呢?这就是为了有更好的安全性和可靠性,避免上面的try block抛出了其它未考虑到的异常对象时导致的程序出现意外崩溃的严重后果,而且这在用VC开发的系统上更特别有效,因为catch(…)能捕获系统出现的异常,而系统异常往往令程序员头痛了,现在系统一般都比较复杂,而且由很多人共同开发,一不小心就会导致一个指针变量指向了其它非法区域,结果意外灾难不幸发生了。catch(…)为这种潜在的隐患提供了一种有效的补救措施。*********************************************************/catch(…){}
}

自定义异常类:

#include <iostream>  
#include <exception>  
using namespace std;  //可以自己定义Exception  
class myexception: public exception  
{  virtual const char* what() const throw()  {  return "My exception happened";  }  
}myex;  int main () {  try  {      if(true)    //如果,则抛出异常;  throw myex;  }  catch (exception& e)  {  cout << e.what() << endl;  }  return 0;  
} 
//标准异常类
#include<iostream>//头文件
#include<stdExcept>
using namespace std;/*
标准异常类体系如下: 缩进层次表示继承关系
exception #include <exception>runtime_error #include <stdexcept>overflow_errorunderflow_errorrange_errorlogic_error #include <stdexcept>invalid_argumentlength_errorout_of_rangedomain_errorbad_alloc <new>bad_exceptionbad_cast <typeinfo>bad_typeid <typeinfo>
它们都是类。需要引用的头文件已经标注。没有标的,那么它的头文件就是上一层的头文件。
*///自定义异常类,继承自exception
class myException :public exception
{
public:myException(char* c){m_p = c;}//what()函数返回错误信息virtual char* what(){cout << "异常类型为 myException: "<< m_p << endl;return m_p;}
private:char *m_p;
};void test_func()
{throw myException("出错啦!");//throw bad_alloc();
}
int main()
{try{test_func();}catch (myException& e){e.what();}catch (bad_alloc& e){e.what();}catch (...){cout << "Unknown Error" << endl;}system("pause");return 0;
}

 

参考资料:

https://www.cnblogs.com/MrYuan/p/4800257.html

https://blog.csdn.net/misayaaaaa/article/details/90108912

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收

SharePoint 承担着文件管理的工作&#xff0c;默认都是将它们以BLOB的数据形式存储在内容数据库当中&#xff1b;当文件大时&#xff0c;就很容易导致数据库容量被这些BLOB数据所快速消耗&#xff0c;而且频繁地对这些大数据量的BLOB数据进行读写访问&#xff0c;很容易在SQL端…

Processing 闪烁的圆 动画效果

打开Processing,CtrlR运行. 运行效果 : class myRect {float x,y;float r,a;//banjing secai bianhua myRect(float x, float y, float r,float a) {this.x x;this.y y;this.r r;this.a a;}void chang(){this.a 0.02;} void display() {stroke(255);fill(120-120*cos(a…

用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?

python 类中一定需要有 __init __方法么&#xff1f;没有的会怎样&#xff1f; 在回答这个问题之前&#xff0c;先说两个问题&#xff1a;① 面向对象编程&#xff1f; ② 什么是类&#xff1f; 面向对象&#xff0c;先上一个正式点的解释&#xff1a; “把一组数据结构和处…

了解 SharePoint 2010 开发中的关键设计决定

在开发项目时&#xff0c;我们经常用到SVN.但是有时候&#xff0c;只知道把源码放到trunk , 把一些文档放到Document下面。其它的目录都应该放什么东西&#xff0c;应该怎么用。可能都有点模糊。 Branch 目录 &#xff1a; 跟工程项目相关的各个工程版本分支。该目录下面的版…

C++,string类的指针,string类数组的指针 string *s

可以这样&#xff1a; #include<iostream> #include<string> using namespace std;int main(void) {string s "hello";//定义一个char类型指针&#xff0c;把string s的首元素地址赋给pt,则pt指向字符串s.char *pt &s[0]; cout << pt <&…

了解 SharePoint 2010 开发中的关键点

**摘要&#xff1a;**了解为 Microsoft SharePoint 2010 规划和开发业务解决方案时必须做出的关键点。 上次修改时间&#xff1a; 2012年3月13日 适用范围&#xff1a; Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Fo…

C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历

运用到的知识&#xff1a;&#xff08;不分先后&#xff09; 模板&#xff0c;类&#xff0c;循环数组&#xff0c;线性表&#xff0c;指针&#xff0c;异常&#xff0c;迭代器&#xff0c;输入输出等C基础 #include<iterator> #include<iostream> #include<v…

SharePoint2013 2019性能及限制

适用于&#xff1a;2013 2019 SharePoint Online 本文档介绍 SharePoint Server 2013 的软件边界和限制。其中包括&#xff1a; 边界&#xff1a; 根据设计无法超过的静态限制 阈值&#xff1a; 为满足特定要求而能够超过的可配置限制 支持的限制&#xff1a; 已默认设置为…

Anaconda安装绘图模块altair

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple altair

MOSS/Sharepoint RBS概念以及运用

注&#xff1a;原文作者不知道是谁&#xff0c;先收藏了这篇&#xff08;若有侵权&#xff0c;请留言&#xff0c;删除&#xff09; EBS -> External Blob Storage 外部大二进制对象存储 RBS -> Remote Blob Storage 远程大二进制对象存储 这俩概念据我所知&#xff0c;…

【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)

&#xff08;博文体系参考&#xff1a;《Python数据分析与应用》课本&#xff09; 任务数据如下&#xff1a; 读入csv文件时&#xff0c;encoding必须是正确的&#xff0c;常用的编码格式有&#xff1a;UTF-8 , UTF-16 , GBK , GB2312 , GB18030等。 如果和文件的编码格式不符…

SQL Server 中“dbo”到底是什么

在&#xff33;&#xff31;&#xff2c; Server中看见很多表名都有前缀dbo&#xff0c;但是不写也可以。比如pubs的数据库中的表dbo.title &#xff11;&#xff0e; dbo是一个构架(schema)&#xff0c;在sql2005中,表的调用格式如下:"数据库名.构架名.表名",同一个…

win10,配置环境变量时系统环境变量和用户环境变量的优先级

关于%%中间夹着的东西&#xff0c;比如%AppData%的路径&#xff0c;是在注册表中可以修改的&#xff0c;用户也可以自定义这种%...%&#xff0c;相当于你定义了一个路径常量&#xff0c;定义方法也是去系统的环境变量中去添加即可。 比如一般常用%JAVAHOME%这种。 参考文章&a…

sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系**

1.一个数据库用户可以对应多个架构&#xff08;架构是表容器&#xff09;。架构里面包含的是数据库表。 2.一个数据库角色有可能涉及多个架构。数据库角色对应的是权限。 3.一个用户对应一个数据库角色。 4.登录名与数据库用户在服务器级别是一对多的&#xff1b;在数据库级…

python 字典、列表、字符串 之间的相互转换

1、列表与字符串转换 列表转字符串&#xff1a; 将列表中的内容拼接成一个字符串 将列表中的值转成字符串 字符串转列表&#xff1a; 用eval转换 将字符串每个字符转成列表中的值 将字符串按分割成列表 2、列表与字典转换 列表转字典&#xff1a; 将两个列表转成字典 将嵌…

【转】SharePoint开发中可能用到的各种Context(上下文)

第一部分 服务器端上下文 一、HttpContext 这个……我想就不用再介绍了&#xff0c;SharePoint运行在标准的ASP.NET框架下&#xff08;2003用的不是标准的ASP.NET 1.1&#xff0c;不过这年头还有人用2003么&#xff09;&#xff0c;所以这个对象的使用和ASP.NET没有任何区别。…

Python 字符串前面加u,r,b,f的含义

1、字符串前加 u 例&#xff1a;u"我是含有中文字符组成的字符串。" 作用&#xff1a; 后面字符串以 Unicode 格式 进行编码&#xff0c;一般用在中文字符串前面&#xff0c;防止因为源码储存格式问题&#xff0c;导致再次使用时出现乱码。 2、字符串前加 r 例&a…

【转】aspx,ascx和ashx使用小结

做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们&#xff0c;网上有很多文章介绍。“纸上得来终觉浅&#xff0c;绝知此事要躬行”&#xff0c;下面自己总结一下做个笔记。1、.aspx Web窗体设计页面。Web窗体页由两部分组成&#xff1a;视觉元素&#xff08;html、服…

【转】执行Import-SPWeb报错Import-SPWeb : Requested value 'PublishingPages' was not found

Import-SPWeb : Requested value PublishingPages was not found. 【解决办法】 1.找到CPM文件 2.把cpm文件后缀名改为cab&#xff0c;如果有多个cmp需要把所有文件改为cab 3.使用cmd全部解压&#xff0c;然后找到Manifest.xml 4.找到“PublishingPages”&#xff0c;替换为…

【Gym - 101775J】Straight Master(差分,思维)

题干&#xff1a; A straight is a poker hand containing five cards of sequential rank, not necessarily to be the same suit. For example, a hand containing 7 club, 6 spade, 5 spade, 4 heart and 3 diamond forms a straight. In this problem, we extend the defi…