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会有一些风险,比如: 文件是 ...
随机推荐
- 简单实现异步编程promise模式
本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...
- 让wego微购购物分享系统采集拍拍数据功能之腾讯paipai功能采集插件
wego是一款很不错的导购系统,无论前后台设计风格和功能都还不错,可有时我们的确需要一些自定义的功能,毕竟万千世界,大家都做一样的东西,采集同样的数据,能不烦吗?哈哈,今天就奉献上一个wego拍拍采集 ...
- Eclipse中添加PyDev插件
思路 1.启动Eclipse, 2.点击Help->Install New Software... 3.在弹出的对话框中,点Add 按钮. 4.Name中填:Pydev, Location中填h ...
- [LintCode] Paint House 粉刷房子
There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...
- nginx连接php fastcgi配置
匹配到php结尾的文件抛到后端 后端php端口9000
- 用一段JS代码来比较各浏览器的极限内存与运算速度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux 根据组名查询出该组内所有成员
目前linux中没有直接根据组名查询组员的命令. 目前系统提供的查找组员和组之间的关系的方法有两种, 一种是:查找/etc/passwd和/etc/group目录,根据/etc/group目录里面的组 ...
- 获取Java系统相关信息
package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...
- iOS no visible @interface for 'UIButton' declares the selector errors
no visible @interface for 'UIButton' declares the selector errors 原理不是特别理解,通过清理缓存,代码更新了,Xcode还是读旧的缓 ...
- svn文件批量清除
svn文件批量清除 http://files.cnblogs.com/files/douxuyao/clearsvn.rar