说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于捕获硬件异常和软件异常的问题

编辑:说三道四文库 发布时间:2017-10-22 02:05
HTML文档下载 WORD文档下载 PDF文档下载
通常soft exception我们用
try
{
}
catch(...)
{
}

hardware exception用
__try
{
}
__exception(...)
{
}


__try
{
}
__finally
{
}


但是他们不能互相包容,也就是指不能这样写:
__try
{
  try
  {
  }
  catch(...)
  {
  }
}
__exception(...)
{
}

但是如果我需要同时捕获一段代码中所有的硬件异常和软件异常,这时怎么办呢?
求大虾指点~

谢谢~~~
gz
You cannot use both __try/__except (structured exception handling) and try/catch (C++ exception handling) in the same function

but you can like that:
#include <stdio.h>
void test();
int main(int argc, char* argv[])
{
puts("hello");
try
{
test();
  puts("in try");
}
catch(...)
{
puts("in catch");
}
puts("world");
return 0;
}
void test()
{
int* p = 0x00000000;   // pointer to NULL

__try{
puts("in __try");
*p = 13;    // causes an access violation exception;
}
__except(puts("in __except"), 1)
{
puts("in __except");
}
}
同意 phiger(phiger)
谢谢,我已经解决:

Exception Handling Differences
Home |  Overview |  How Do I |  FAQ

The major difference between structured exception handling and C++ exception handling is that the C++ exception handling model deals in types, while the C structured exception handling model deals with exceptions of one type — specifically, unsigned int. That is, C exceptions are identified by an unsigned integer value, whereas C++ exceptions are identified by data type. When an exception is raised in C, each possible handler executes a filter that examines the C exception context and determines whether to accept the exception, pass it to some other handler, or ignore it. When an exception is thrown in C++, it may be of any type.

A second difference is that the C structured exception handling model is referred to as “asynchronous” in that exceptions occur secondary to the normal flow of control. The C++ exception handling mechanism is fully “synchronous,” which means that exceptions occur only when they are thrown.

If a C exception is raised in a C++ program, it can be handled by a structured exception handler with its associated filter or by a C++ catch handler, whichever is dynamically nearer to the exception context. For example, the following C++ program raises a C exception inside a C++ try context:

#include <iostream.h>

void SEHFunc( void );

int main()
{
    try
    {
        SEHFunc();
    }
    catch( ... )
    {
        cout << "Caught a C exception."<< endl;
    }
    return 0;
}
void SEHFunc()
{
    __try
    {
        int x, y = 0;
        x = 5 / y;
    }
    __finally
    {
        cout << "In finally." << endl;
    }
}

This is the output from the preceding example:

In finally.
Caught a C exception.

C Exception Wrapper Class
In a simple example like the above, the C exception can be caught only by an ellipsis (...) catch handler. No information about the type or nature of the exception is communicated to the handler. While this method works, in some cases you may need to define a transformation between the two exception handling models so that each C exception is associated with a specific class. To do this, you can define a C exception "wrapper" class, which can be used or derived from in order to attribute a specific class type to a C exception. By doing so, each C exception can be handled by a C++ catch handler more separately than in the preceding example.

Your wrapper class might have an interface consisting of some member functions that determine the value of the exception, and that access the extended exception context information provided by the C exception model. You might also want to define a default constructor and a constructor that accepts an unsigned int argument (to provide for the underlying C exception representation), and a bitwise copy constructor. The following is a possible implementation of a C exception wrapper class:

class SE_Exception
{
private:
    SE_Exception() {}
    SE_Exception( SE_Exception& ) {}
    unsigned int nSE;
public:
    SE_Exception( unsigned int n ) : nSE( n ) {}
    ~SE_Exception() {}
    unsigned int getSeNumber() { return nSE; }
};

To use this class, you install a custom C exception translation function that is called by the internal exception handling mechanism each time a C exception is thrown. Within your translation function, you can throw any typed exception (perhaps an SE_Exception type, or a class type derived from SE_Exception) that can be caught by an appropriate matching C++ catch handler. The translation function can simply return, which indicates that it did not handle the exception. If the translation function itself raises a C exception, terminate is called.

To specify a custom translation function, call the _set_se_translator function with the name of your translation function as its single argument. The translation function that you write is called once for each function invocation on the stack that has try blocks. There is no default translation function; if you do not specify one by calling _set_se_translator, the C exception can only be caught by an ellipsis catch handler.

For example, the following code installs a custom translation function, then raises a C exception that is wrapped by the SE_Exception class:

#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
    SE_Exception() {}
    SE_Exception( SE_Exception& ) {}
    unsigned int nSE;
public:
    SE_Exception(unsigned int n) : nSE(n) {}
    ~SE_Exception() {}
    unsigned int getSeNumber() { return nSE; }
};

void SEFunc(void);
void trans_func( unsigned, _EXCEPTION_POINTERS*);

int main()
{
    _set_se_translator( trans_func );
    try
    {
        SEFunc();
    }
    catch( SE_Exception e )
    {
        printf( "Caught a __try exception with SE_Exception.\n" );
        printf( "nSE = 0x%x\n", e.getSeNumber() );
    }
    return 0;
}
void SEFunc()
{
    __try
    {
        int x, y=0;
        x = 5 / y;
    }
    __finally
    {
        printf( "In finally\n" );
    }
}
void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp )
{
    printf( "In trans_func.\n" );
    throw SE_Exception( u );

不过我用更简单的方法解决了,以下是源码,散分:

// std35.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>
#include <excpt.h>
#include <eh.h>
#include <windows.h>

void trans_func(unsigned int eCode, _EXCEPTION_POINTERS* pExp)
{
switch (eCode)
{
case EXCEPTION_ACCESS_VIOLATION:
throw exception("The thread tried to read from or write to a virtual address for which it does not have the appropriate access.");

case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
throw exception("The thread tried to access an array element that is out of bounds and the underlying hardware supports bounds checking.");

case EXCEPTION_BREAKPOINT:
throw exception("A breakpoint was encountered.");

case EXCEPTION_DATATYPE_MISALIGNMENT:
throw exception("The thread tried to read or write data that is misaligned on hardware that does not provide alignment. For example, 16-bit values must be aligned on 2-byte boundaries; 32-bit values on 4-byte boundaries, and so on.");

case EXCEPTION_FLT_DENORMAL_OPERAND:
throw exception("One of the operands in a floating-point operation is denormal. A denormal value is one that is too small to represent as a standard floating-point value.");

case EXCEPTION_FLT_DIVIDE_BY_ZERO:
throw exception("The thread tried to divide a floating-point value by a floating-point divisor of zero.");

case EXCEPTION_FLT_INEXACT_RESULT:
throw exception("The result of a floating-point operation cannot be represented exactly as a decimal fraction.");

case EXCEPTION_FLT_INVALID_OPERATION:
throw exception("This exception represents any floating-point exception not included in this list.");

case EXCEPTION_FLT_OVERFLOW:
throw exception("The exponent of a floating-point operation is greater than the magnitude allowed by the corresponding type.");

case EXCEPTION_FLT_STACK_CHECK:
throw exception("The stack overflowed or underflowed as the result of a floating-point operation.");

case EXCEPTION_FLT_UNDERFLOW:
throw exception("The exponent of a floating-point operation is less than the magnitude allowed by the corresponding type.");

case EXCEPTION_ILLEGAL_INSTRUCTION:
throw exception("The thread tried to execute an invalid instruction.");

case EXCEPTION_IN_PAGE_ERROR:
throw exception("The thread tried to access a page that was not present, and the system was unable to load the page. For example, this exception might occur if a network connection is lost while running a program over the network.");

case EXCEPTION_INT_DIVIDE_BY_ZERO:
throw exception("The thread tried to divide an integer value by an integer divisor of zero.");

case EXCEPTION_INT_OVERFLOW:
throw exception("The result of an integer operation caused a carry out of the most significant bit of the result.");

case EXCEPTION_INVALID_DISPOSITION:
throw exception("An exception handler returned an invalid disposition to the exception dispatcher. Programmers using a high-level language such as C should never encounter this exception.");

case EXCEPTION_NONCONTINUABLE_EXCEPTION:
throw exception("The thread tried to continue execution after a noncontinuable exception occurred.");

case EXCEPTION_PRIV_INSTRUCTION:
throw exception("The thread tried to execute an instruction whose operation is not allowed in the current machine mode.");

case EXCEPTION_SINGLE_STEP:
throw exception("A trace trap or other single-instruction mechanism signaled that one instruction has been executed.");

case EXCEPTION_STACK_OVERFLOW:
throw exception("The thread used up its stack.");

default:
throw exception("Unknow exception!");
}
}

#include <vector>

void Run()
{
int sz[2];
int *p1 = 0x00000000;
int *p2;

std::vector<int> vec(4);

throw exception("nothing");

int a=5, b=0;
a = a / b;
*p1 = 1;
a = vec[1000];
*p2 = 2;
}

void Func()
{
__try
{
Run();
}
__finally
{
cout << "finally" << endl;
}
}

int main(int argc, char* argv[])
{
_set_se_translator( trans_func );
try
{
Func();
}
catch(exception &e)
{
cout << e.what() << endl;
}

cout << "game over" << endl;

return 0;
}
??????????????????
Intel将在2014年为数据中心用户定制低功耗SoC芯片 情绪低落?没事,让计算机来帮你! 水果生意难做 前新浪架构师徐佳转行试水挖煤 思考软件开发中的快与慢 Apache CouchDB注入新鲜血液,整合分布式技术 CSS Shapes:Web设计人员的新工具 Android 4.3正式发布:四大新功能一览 史玉柱的创业经验谈 3G门户和GO桌面:海外推广的生意经 系统级编程语言性能大PK D语言成首选 解读Facebook第二季度财报 移动业务风生水起 如何避免失败,像Google一样玩转大数据 首届游戏运营技术论坛隆重开幕,共论大数据时代的游戏运营之道 OpenStack Swift遇到了Erasure Code 微软Win7 IE11开发者预览版发布 开始改进开发工具讨好开发者 个性化推荐服务商百分点宣布B轮融资1000万美金 全球著名互联网企业背后的开源力量 基础设施对决Facebook vs. Google:差距绝不是一点点 Amazon Q2财报同比转亏,但AWS反其道而行:高歌猛进! 开拓海外市场的两年:海外上线小技巧 SDCC 2013首批讲师名单出炉 一线工程师唱主角 [开源推荐] 跨平台的.NET运行环境 Mono 3.2发布 Heroku发布API平台Beta版 采用OAuth2.0安全授权 大数据时代:移动数据能为我们带来什么? iOS开发经验谈:如何提高应用开发效率? 贝索斯:你否定亚马逊的现在 我决定亚马逊的未来 谷歌新产品Chromecast:一夜之间价格从35美元飙至100美元 移动周报:苹果5周年限免神作,BADLAND开发者访谈 开源平台Cloud Foundry获IBM和百度支持,步入高速发展的“黄金期” GDK仍未发布 谷歌鼓励Glass开发者可提前用Android SDK开发 Adobe发布PhoneGap 3.0 支持命令行工具 关于arp的小问题 请给我一个在线升级的例子。。。。 更新记录遇到的简单问题!!请高手指点--在线等待 关于字符串问题(局部变量)急!!!!!!!!!今夜无眠 VB程序打包好以后为什么不能安装 兄弟们给我起名啦,,up也有分!! 学单片机,推荐点好书,谢谢各位大虾了 用JSP条件来触发Javascript弹出一个小窗口怎么做? 难道要给32个参数? PB 连接 SQL SERVER 2000 问题(多用户无响应!!) 关于Pointer类型数据和自定义的数据类型(Record),TList的保存问题。 请问哪里有《WRITING WINDOWS VXD AND DEVICE DRIVER》下载,中英文皆可,作者KAREN HAZZAH 还是#pragma的问题请教高手 用鼠标选定图形应该怎么做? !!!超长数字,大家猜猜,欢迎灌水!!!! 关于localhost不能直接连接的问题 请问一个很简单的问题,做了一个查询功能,如果没有查到记录,怎样做才能提示:没有满足条件的记录!的这样的信息呢?很菜的问题! 如何在浏览器客户端上载一个文件,传送到SERVER数据库? 关于求余和with语句 各位各位,小弟有新发现哦,爽。 我想学GIS (dos高手的挑战!!!)如何在dos下对声卡编程选通CD-IN通道,实现CD播放 jdbc连接oracle8i的问题?急。 如何用<logic:iterate>与<html:radio>配合将<logic:iterate>的列出多项列表项,从中选定一项,并对该项进行操作?如何联系?谢谢!急用! 哪有jbuilder中文版文档 请问怎样将整个屏幕拷贝到一个Image对象? 如何在vbscript中获取javascript取得的下拉菜单所选择的值?(急,在线等) 在聊天室中服务器的socket怎么和多个客户端的socket建立连接? 如何在Post以后保存Post之前的值 史上最恐怖的10个鬼故事!!! j2ee中的EAR 和war是怎么生成的,具体用什么工具,怎么生成的 紧急降落求救(在线等待)…………谁能告诉这个水晶报表的问题04, 图形如何和数据库关联? 积分运算? 急!!! 怎样在RowFilter中用函数表达式, 如SubString, ToString等? VB中的WINSOCK在哪里?我打开VB找了半天没找到这个控件,真衰 请教.... 能否在autoexec.bat的内容里: path ......... 加上 ;c:\windows \.....之类的? tomcat 4 中配置JDBCRealm的问题。急啊!! mysql怎么用money类型的数据? 会用FileGateway的进来 服务器配置(jdk1.3+tomcat或jswdk) 关于dreamweaver mx的font preference设置 redhat9.0的安装问题 如何获取文件上传者的IP地址?(马上给分)万分感激,在线等待. 各位大侠帮帮忙!急!!!有高分! 如何删除用户控件 请问我将汉字写入一个HTML文件,但显示出来是乱码..有没有解决办法 请教各位前辈,继续提问关于《Visual basic 与RSC232/485串行通信》的问题 高分求救---如何把wma文件转成mp3文件 200分求购自动动生成的缩略图的代码???不够有分加 小学男生喜欢女生的表现五年级替别人问的,大家要打就认真打哦,那个男生很重面子,做事都很有尊严不厚脸皮,他跟那个女生关系还算不错,他经常捉弄她,耍她,他也跟别的女生闹,但不如和他 第七题. help me! 有几道题不会做1.“人说山西好地方,地肥水美醋更香”是由电影《我们村里的年青人》的插曲中的哪两句歌词改编而来的?2.用成语对下联 望梅止渴-( ) 趁火打劫-( ) 9a²-b²-4b-4分解因式 An Introduction to Linguistics 有中文版么 空的那一题不会,help me! 五年级小学相声要两位男生演的 第七题哦 如果,12这个数是100%的话,那么8是 12的 百分之几?我都快想吐出来了... 第七题求 买书,Cognitive Linguistics:An Introduction想买这本书,Cognitive Linguistics:An Introduction 作者:David Lee出版社:Oxford University Press 一本红皮的,全英文的书,哪位有这方面的信息也可,这本书在当当网上面没有, help me, 初三二次函数所有式子 包括顶点坐标 对称轴 开口方向 复制的别来 我早看完了 如何复习Linguistics:An Introduction (《语言学教程》)这本书,考天师的英研 分解因式:x²-y²-4x+6y-5 钓鱼的启示中,作者描写周围环境的目的是什么?还有一个问题,也是钓鱼的启示里面的:“孩子,你得把它放回湖里去”这句话该用怎样的语气来读?为什么?快,必须要在今天之内,好的有分加 亮落难的王子 这是一道数学他题拜托了,某商品原价为一百元,经两次连续降价后售价为八十一元,求该商品每次,降价的百分...这是一道数学他题拜托了,某商品原价为一百元,经两次连续降价后售价为八十一 钓鱼的启示中作者描写环境的目的是什么 第七题喔 刚刚商品那题为什么原价是降价百分之20-原价 就等于要上涨的 爸爸去哪儿2、第四站的观后感重赏 董存瑞的作文怎么写? 请问什么是“休谟问题”? 分解因式3(a^4+a^2*b^2+b^4)-9a^2*b^2 迅速求出下列式子的值 休谟问题是什么?RT 增长倍数怎么计算从2007年的265亿美元猛增至2013年的902亿美元,增长3.5倍问,这3.5是怎么计算出来的?请细说计算过程. 把4米长的绳子平均分成8段,每段是绳子全长的八分之一,对还是错 英语一致关系习题求解!1.I don't swim now,but I__when I was a kid.A.used to it B.used to doing it C.used to D.used to do 答案为什么选C而不能是D?2.It is reported that__adopted children want to kow who their naturai parents are.A.the 打架思想总结怎么写啊. 分解因式2/9a^2-4/3a+2 董存瑞 作文500字 爱国英雄 高中对数函数比大小 已知x2+y2=1,则y/(x+2)的取值范围是多少? 这个式子怎么解?求x的值,顺便把过程说一下 利用对数函数比较大小log以a为底b与log以b为底a(a大于b大于1) 因式分解9a^6+4不要用到虚数和根式 You don’t have to dwell on the mistake in the operation 翻译成中文 敬畏生命中哪些词语写出了作者被生命 逐渐震撼 要作者的感情变化(不好意思,没说明) OP07增大倍数怎么计算的看这个图,OP07放大倍数是怎么计算的?还有R16是什么作用 求(2x+y)(4x2-2xy+y2)的值 文中用那些描写时间的句子写出了作者被生命逐渐震撼的过程?那是一个夏天长的不能再长的下午,在印第安那州的一个湖边.我起先是不经意地坐着看书,忽然发现湖边 有几棵树正在飘散一些 有关董存瑞作文300字左右 路灯,文中能概括我对路灯观感、情感的变化是全文的线索,请简要的加以说明 敬畏生命 文中哪些词写出了作者被生命“逐渐震撼的过程 几种从句中what where等词用不好 到后面就猜不出了,谁知道这是什么成语啊 关于高中数学logaN的公式 尽量仔细点 请教我刚加入百度hi,怎么寻找并加入想去的群? 甲乙丙三人行路,甲每分钟60米,乙每分钟走50米,丙每分钟走40米,甲从A地、乙和丙从B地同时出发相向而行,甲和乙相遇后,过了15分钟后又与丙相遇,求A、B两地间的距离.一本书小华第一天看了全 1+1=2求公式 什么是溢价倍数或折扣倍率? 如果二次函数y=mx2+(m-3)x+1的图像与X轴的交点至少有一个在原点的右侧,试求m的取值范围 田宫黄盖胶水和绿盖胶水有什么不同?如题,在效果上,价钱上的异同? 超标倍数如何计算 6分之8怎么在数轴上表示?12分之15怎么在数轴上表示?15分之20怎么在数轴上表示?6分之10怎么在数轴上表示?9分之12怎么在数轴上表示? 小于1的价格在用asp输出的时候,程序自动省略了小数点前面的“0”,怎么显示小数点前的“0”?在修改商城程序的时候,价格通常是XXX.00元 这样的形式显示的,而小于1的价格必然0.98在用asp输出 第七题哟 所以我不会 什么叫我去找之类的 不必了 澳大利亚捐精人数下降 从海外进口满足埃及穆兄会下属组织拟在穆尔西受审当天韩国法务部否认对检方调查国情院干政案韩国女劳工曾被日本强征 胜诉将获赔上国际晚班车:日本今日起举行大规模\"调查指澳洲侨民向往亚洲 首选泰国、中安倍护卫车连生交通事故 日媒称尚无前“乔布斯”库彻跪地受聘联想 成为联巴黎迪斯尼乐园海盗船发生意外 5岁男数据显示美遣返非法移民人数达6年来最德国法兰克福市计划在闹市区巡警肩上装澳大利亚一养老院发生毒杀案造成二死一泰国国会再开赦免法案审议 政治博弈错联合特使称如无叙反对派参与 将不会举日本内阁法制局长官:日本变更宪法解释澳老汉在米面中掺麻黄碱企图蒙混过关被旧金山地方检察院举行反家暴妇女维权座加拿大女子相亲网站“钓男人”吃免费餐以色列批准新建1500套定居点住房遭美国50州首富名单出笼 盖茨巴菲特仍澳洲男子将宠物店名犬藏入裤裆内带走接狗大户玩大了 伊朗示威者焚烧沙特使馆魅蓝metal电信版1月4日魅族官网网络平台,未来或许会成为中国式的商业彭劲秀:“第一先贤”俞大维除京平、大广 北京因雾封闭高速已恢复备孕妈妈必看!什么情况下可以生女孩。福州假日经济火 商场人流如潮反四风2015年报:处理441名厅官美国华人冬泳庆跨年 比任何新年派对都尚未在电影中出现的中华远古十大神兽,日本百货公司新年开店推福袋 成中国游一周国际图片新闻精粹(2015.12巨型猴面具亮相福州吸眼球加拿大多慈善团体改向华裔筹款 加大针复苏!魔兽空接+隔扣石佛 垃圾时间不梦瑶一周股市策略:本周走势就一个字!中国驻巴基斯坦使馆向维吾尔族侨胞捐赠2016年开门之战如何演绎?是“红”什么是“丹书铁券”和“铁帽子王”?朝鲜民众欢庆新年男子驾法拉利疑失控连撞四车 八人受伤
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘