cpp异常详解
1. 异常介绍
在函数在执行过程中如果碰到对错误的处理可以有两种方式, 1. 返回错误,2. 使用异常。 如果作为函数的调用者想要知道具体的错误信息, 就需要维护一套错误列表, 或者用string类型的返回。显然这两种使用起来都不那么方便。
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序。这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理。这使得底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理。
2. 使用介绍
c++的异常处理机制由三部分组成:try(检查), throw(抛出),catch(捕获)。最典型的用法如下:
void doThrow(){
throw std::string("throw everything");
}
void testException(){
try
{
doThrow();
}
catch (std::string e){
std::cout << e << std::endl;
}
catch (...)
{
std::cout << "exception" << std::endl;
}
}
throw 可以任何东西,catch也可以捕捉然后exception.
3. 进一步用法
当然编程中有一个非常重要的约定就是“约束”。我们要对能抛出的异常能进行约束, 所以标准库提供了一个类std::exception 来给我们继承使用。exception 中一个最重要的函数是:
class exception{
virtual const char * __CLR_OR_THIS_CALL what() const _THROW0()
{ // return pointer to message string
return (_Ptr != 0 ? _Ptr : "unknown exception");
}
}
我们可以重载它,然后抛出自己的错误信息。举个例子:
class ParserException : public std::exception
{
public:
ParserException(const char *what, void *where)
: m_what(what)
, m_where(where)
{
}
virtual const char *what() const throw()
{
return m_what;
}
template<class Ch>
Ch *where() const
{
return reinterpret_cast<Ch *>(m_where);
}
private:
const char *m_what;
void *m_where;
};
#define PARSE_ERROR(what, where) throw ParserException(what, where)
void doThrow(){
PARSE_ERROR("throw everything", nullptr);
}
void testException(){
try
{
doThrow();
}
catch (ParserException e){
std::cout << e.what() << std::endl;
}
}
好吧, 其实换汤不换药。
4. 总结
本文主要介绍了c++异常的典型使用方法。
异常时一种常见的错误处理方法,它可以把错误从程序的逻辑处理中剥离出来。当然显然,异常在c++中就是一个能引起口水的问题, 用还是不用?好吧我的意见就是:想用就用。
cpp异常详解的更多相关文章
- JAVA基础——异常详解
JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- Java面向对象之异常详解
目录 Java面向对象之异常[一] Java面向对象之异常[二] 捕获异常的规则 访问异常信息 异常对方法重写的影响 finally详解 Java面向对象之异常[一] Java面向对象之异常[二] 往 ...
- Java基础 - 异常详解
异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...
- java笔记--异常详解与处理
一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出. 2.只有此类或其子类才 ...
- c++异常详解
一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...
- Java中的异常详解
一.异常定义 阻止当前方法或作用域继续执行的问题,称为异常 二.异常分析 所有不正常类都继承Throwable类,这个类主要有两个子类Error类和Exception类.Error指系统错误 ...
- java异常详解
java异常需要弄清楚如下几个问题: 1.java异常的层次结构 2.搞清楚问题:java中异常抛出后代码还会继续执行吗? 答:该问题可以参考该博文,完美的回答了我的疑惑:http://www.cnb ...
- Android 开发 关于7.0 FileUriExposedException异常 详解
异常原因 Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法.原因在于使用file://Uri会有一些风险,比如: 文件是 ...
随机推荐
- jQuery常用方法验证
验证邮箱: $('input[data-name="email"]').keyup(function () { var em; em = $(this).val(); if (!e ...
- preventDefault()方法
该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作). 例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调 ...
- 在VS2012/2013上编辑和调试Quick-cocos2d-x的Lua代码
类似教程链接:http://www.cocoachina.com/bbs/read.php?tid=205043 步骤: 一.Quick-cocos2d-x 最新版本或要打算使用的版本 (http:/ ...
- BizTalk开发系列(三十四) Xpath
XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk.但是如果对Xpath有一定了解的 话,在很多应用下会使你的开发更 ...
- php课程---练习(发布新闻)
做一个发布新闻的页面,实现发布新闻,查看新闻,修改新闻与删除等功能 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- BZOJ1857[SCOI2010]传送带
题目大意:平面上两条线段,一个人从一条线段的一个点到另一条线段的一个点,最小时间是多少 路径肯定是在一条线段上走一段,然后走平面,最后再走另一条线段,那么需要确定的就是在两条线段上走的距离,其他暴力算 ...
- app与后台通信协议
通用的语言有很多种,例如英语和中文,在网络的通讯中,通用的协议有很多,其中http是被最广泛使用的.如果是私有的协议,那就只能自己设计了. 用http是最方便的,如果是私有协议,包含协议的封装和拆解, ...
- 打包成zip
protected void btnExportZip_Click(object sender,EventArgs e) { string archiveName=String.Format(&quo ...
- ArcMap中,如何查看当前工具是否在执行?如何将工具调到前台来执行?
ArcMap中,如何查看当前工具是否在执行?如何将工具调到前台来执行? 描述 如何查看当前工具是否在执行?如何将工具调到前台来执行? 解决办法 后台GP执行中,可以在 Geoprocessing菜单中 ...
- laravel redis
安装配置redis服务器 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-.tar.gz $ c ...