java terminate_学习Java用于异常处理的terminate()函数
异常处理是一个微妙的问题,你应该尽可能优雅地处理所有异常。要达到这个目的,你需要学习terminate()函数。
terminate()函数在程序抛出一个异常并且异常没有被捕获的时候被调用,像下面这样:
#include
#include
void on_terminate()
{
std::cout << "terminate() 函数被调用了!" << std::endl;
std::cin.get();
}
int main()
{
// 如果用 VC6,去掉“std::”前缀
std::set_terminate( on_terminate);
throw std::exception();
std::cout << "terminate() 函数没有被调用!" << std::endl;
std::cin.get();
return 0;
}
避免这种情形的方案一开始看起来很简单:
int main()
{
try
{
/* code */
}
catch( std::exception & exc)
{
// 记录到日志,或作其他处理
}
catch(...)
{
// 记录下“Unknown exception”
}
return 0;
}
不过,在多线程应用程序中情况变得有点复杂,因为你创建的每个线程都要有上面的(catch)处理过程。
然而terminate()函数在许多其它情况下会被调用,包括:
当你抛出一个异常,并且在它的拷贝构造函数中,另一个异常被抛出。
在堆栈展开的过程中抛出一个异常,此时析构函数抛出一个异常。
当一个静态对象的构造函数或析构函数抛出异常时。
当一个用atexit注册过的函数抛出一个异常时。
当你在代码中写下“throw;”(这意味着重新抛出当前异常),然而并没有当前异常时。
当一个函数抛出一个它的异常说明不允许的异常时
当默认的unexpected()处理过程被调用时
下面的代码演示了上面各种情况下的结果:
#include
#include
void on_terminate()
{ std::cout << "terminate()函数被调用了!" << std::endl;
std::cin.get(); }
[1]
struct custom_exception
{
custom_exception() {}
custom_exception( const custom_exception &)
{ throw std::exception(); }
};
void case_1()
{
try
{ throw custom_exception(); }
catch(...)
{}
}
[2]
struct throw_in_destructor
{
~throw_in_destructor() { throw std::exception(); }
};
void case_2()
{
try
{
throw_in_destructor temp;
throw std::exception();
}
catch(...)
{}
}
来源:考试大-Java认证
责编:冷客 评论 纠错
上一页1
java terminate_学习Java用于异常处理的terminate()函数相关推荐
- 学习用于异常处理的terminate()函数
<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- 深圳php和java,深圳java技术培训学习(Java和PHP区别)
深圳java技术培训学习,深圳Java培训已经越来越普及了,通过Java和PHP区别,Java语言的分布性,Java语言的稳健性我们可以了解的更清楚些. Java和PHP区别 Java和PHP都是编程 ...
- Java 基础学习-Java语言概述
Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...
- 【JAVA】学习java 基础知识
今天我们一起继续学习java吧! IDE集成开发环境 在我们进行java程`序开发的时候,使用的开发工具都叫IDE. 现在流行的java开发工具有: IDEA:有免费的版本和收费的版本,我们当然提倡使 ...
- 软件测试学java,软件测试学习Java的内存模型
原标题:软件测试学习Java的内存模型 软件测试学习Java的内存模型 主内存与工作内存 定义程序中各个变量的访问规则. 规定JVM必须遵循的最小保证. 定义操作的偏序关系.Happens-Befor ...
- 最长公共子序列算法 java,算法学习——java实现最长公共子序列,
算法学习--java实现最长公共子序列学习--java实现最长公共子序列的算法, 实验目的: 输入两个同类型的序列,用动态规划的方法计算它们最长的公共子序列的长度和序列. (推荐教程: Java视频教 ...
- C++异常处理之terminate函数
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级 ...
- 新手如何学习Java以及学习java的步骤
第一步 首先要做好学习前的准备工作:java语言一般用于大型的服务器程序开发,所有有必要了解如下内容:Unix开发环境Unix系统原理.Unix开发环境.Unix常用命令.熟练掌握Unix常用命令:熟 ...
最新文章
- SharePoint Server 2013 之四:部署SharePoint企业版
- c语言数组的一维编程,【C语言】转换一维数组
- 和plc哪个简单点_怎么看PLC梯形图
- 使用sql语句创建和删除约束示例代码
- CImg库【C++】
- 注解返回html页面,【提问】ajax请求返回整个html页面
- final类是否可以被代理_Java 动态代理机制分析及扩展,第 2 部分
- 安装geopandas库
- Hive 窗口函数详解
- 橱柜衣柜 sketchup草图大师设计全屋定制家具意义?谈单拆单生产一起做了?-有屋软件
- creo4.0的计算机系统要求,Creo4.0系统配置文件教程详解 参数设置
- c语言左移函数_corl_,crol(crol函数怎么左移)
- 高数笔记(二):极限的运算法则,极限存在准则,两个重要极限,无穷小的比较
- fanuc机器人负载设定
- Ubuntu 16.04下DNW的安装及使用
- NOI 雇佣兵讲解(c/c++)
- Linux 命令总结和感悟
- 递归查找树形状结(利用steam流的方式)leval值标明
- what Data Fabric
- 石沉大海的简历和优质简历的差别