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

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

编辑:说三道四文库 发布时间:2017-12-18 01:48
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;
}
??????????????????
豌豆机器小组发布最新WRTnode2R,支持华为Liteos、QQ物联与AllJoyn [新书推荐]Node.js项目实践:构建可扩展的Web应用 【简讯】Perl 5.22.0 发布,大幅改进代码! 【征文】特别策划——群雄逐鹿共话新型数据库 针对DCloud侵权质疑,APICloud发布声明 《近匠》小鱼天气,中国风与细粒度空气质量检测 Xcode 7 beta发布,Swift 2.0带来哪些新变化? 【有奖征集】MDCC 2015演讲议题征集全面启动 Swift语言那些鲜为人知的特性 《开源者说》08期:聊聊Java那些事儿 专访唐成:从小工到专家,PostgreSQL的修炼之道 《瞬间之美》作者Robert Hoekman Jr:如何成长为UX领袖人物? TIOBE 2015年6月编程语言排行榜:Swift份额上升,Objective-C成自由落体 【CTO讲堂】Box首位华人核心工程师的回国创业之路 【探秘ES6】系列专栏:ES6简介 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活 【探秘ES6】系列专栏:迭代器和for-of循环 【CTO讲堂】UCloud联合创始人兼CTO莫显峰:如何成长为技术合伙人? 【探秘ES6】系列专栏:生成器 iKair转型传感器及SaaS厂商,发布Maxense平台与9款“云传感器” 免费jQuery幻灯片图片轮播插件Galleriffic的使用方法 专访IBM中国研究院院长沈晓卫博士:全新的物联网来了 《近匠》GYENNO CEO任康:用“勺子”敲开一片新市场 Horde3D——基于C++编写的3D渲染引擎 Maker Faire 2015在深圳正式开幕,关注创客生态系统 Arduino与Seeed Studio达成战略合作——专访Arduino联合创始人Massimo Banzi 免费开源的Bootstrap富文本编辑器bootstrap-wysiwyg使用方法 CCAI2015:首届中国人工智能大会将于7月26-27日在京举行 拥抱互联网+ 用友NC6助力集团企业蜕变数据驱动型公司 《近匠》融云,自主研发真正“不丢消息”的IM云服务 【CTO讲堂】听云CTO Wood:APM实现原理及对IT和产品运营的价值 动态连接库的提取 如何做在线试题考试程序,请给例子.谢谢~~ 请问:在JScript中有什么方法是与C#中的“System.Web.HttpUtility.UrlEncode(string)”相当的? multipage和tabstrip的连接问题 ?@@@ MFC编程:关于GetDocument()@@@ 寻找解决方案 如何把几条sql语句全成一条? 友情提示:多线程浏览器弹出窗口的问题 点网页中的文件下载,直接在浏览器中打开了,我想点击下载后弹出对话框,然后保存. 求救,页面文字的大小如何设置? 关于SQL语句的优化…… 怎么判断一个Input type= text中的数字是不是浮点数? 哪位大哥有关于操作系统中文件系统设计的实例文档,(急用)谢谢。 有关asp中,后台编辑新闻时,上传多图片,如何在前台显示的问题 一定给分,初学java,请问java开发平台的比较 weblogic及EJB属于中间层的吗?( 请问SQLServer数据更新速度与系统配置之间关系的问题 问题还是没有得到解决,请csdn高手进来看看.(在线等!) 请大家帮忙~~~~~ 添加一个矩形框用什么函数,在上面添加文字、颜色呢? 拜托!请问全面学习J2EE一共要装哪些软件?谢谢! 这是我在本机上用ROUTE PRINT出来的内容,请高手们指点! 在线送分!!!谁能帮我解决分页的问题 请问有没有什么简便的方法在数组里插入一条纪录。 打印打印 如何通知一个正在Sleep(INFINITE)的线程结束运行? 小问题 c语言基础问题 上海的朋友!请进来说说如果你/*未来*/女朋友或男朋友第一次来上海,你会带他或她去哪些地方玩??有七到十天时间 请问长时间用光驱放DVD会不会损伤硬盘? 急救 vj6 中如何调用sql数据库 谁能告诉我早期LINUX内核的源代码和C编译器的源代码,哪能找到!谢谢! DB2安装问题 有谁知道北京数字证书认证中心是干吗?他们说的什么信息加密、网上作业身份识别、BGC是什么回事?跟服务器有关吗? 在SQL Server中导库时出现DLL错误,怎么回事 将int型转化为字符型用什么函数? 谁能告诉我早期LINUX内核的源代码和C编译器的源代码,哪能找到!谢谢!要多少分都给! 500分求菜单功能。 很急的问题!希望大家帮忙! jb8中类找不到了??? 请教高手:如何让label显示在text、button等的上面? 新手请高手帮忙了~~~ 谢谢~~~ 500分求菜单功能。 修改数据,提交保存老报错,纳闷~~~ 急!在RED HAT LINUX中怎么配置POP和STMP服务器? 散分呵呵 是真还是假,群众的眼睛是雪亮的! 求助:XP和2003双操作系统,XP用PQ分区后在2003里找不到? 500分求菜单功能。 treeview控件,如何让其点击结点后再从数据库中取得这个节点的下一层节点? 如何在SQL SERVER 2000导入mis.bak文件? 寻找春秋鼎盛,趋之若鹜,万人空巷,画龙点睛,图穷匕见,三顾茅庐,不耻下问 请问这句英语表达的是什么意思?I would like to know if it is possible to reduce the price with larger quantities. The boss the worker how to do it ,or the accident couldn't have happened.A.can't have toldB.ought to tellC.could have toldD.mustn't have told请问这是虚拟语气吗?D为什么不可以? 数学题求救,请列出方程式(比例式),1.一个工厂生产一批玩具,原计划每天生产24件,35天完成.后来因人员减少,实际每天的工作效率只有原来的80%,结果会推迟几天完成?2.甲城和乙城相距368千米 请帮我解一道数学题(“必须”用方程比例式的)一种树苗的成活率是94%.为了保证栽活520棵树,至少要准备这种树苗多少棵? It's his closest yet after a bitter campaign.怎么理解 “Ardennes CamPaign”?不晓得才问嘛. ”磺胺氯吡嗪钠”的英文 英语翻译知识产权本软件及指间科技公司授权您制作的任何副本均为指间科技公司的产品,其知识产权归指间科技公司所有.本软件的结构、组织和代码均为指间科技公司的有价商业秘密和保 英语翻译1 Vacuum compression molding method using preheated charge2 Method of making a molded plastic component having enhanced surface finish3 Molded plastic component having enhanced surface finish想增强自己关于这方面学科的翻译 将下列成语按结构分类:画龙点睛,图穷匕见,三顾茅庐,不耻下问,举一反三,任重道远,春风得意, 墨西哥一糖果厂发生爆炸 至少40人受日媒:日本成俄罗斯牵制中国棋子欧亚经济最高理事会会议召开 乌克兰入澳大利亚军方为因自身失误造成森林大火德媒称攻击默克尔手机系攻击德国的政治法国与德国希望年底前就美国监听与美进外媒:美国债务乱局给中国敲响“警钟”英国BBC知名主播再添性侵罪名 下月美国财长呼吁朝野同意以合理减支取代自沈阳“土豪大院”违法违规 辽宁省纪委沈阳一村主任哥哥占地800亩建房 村工业地产离产业地产还有多远?围绕改革主题力争破解三大难题国足训练被曝遭遇意外刁难 全体国脚被高明33项改革清单任务到人穗警方通报地铁五号线事件环保法要“升级”巧用工资卡理好财 小钱照样能赚大钱春日潮湿天 汤水来祛湿去年公交客运量达56.3亿人次9月底前梳理完成市镇权责清单增持股份至5% 恒大跃升华夏银行第五遮天后续魂修魄炼燃烧光环从亿开始修仙之灭世天下之枭雄崛起乱之吐火族长神兵之御剑除魔殴神神之界面网游之魔幻救赎台东商业步行街旅游旅顺蛇博物馆旅游银七星滑雪场旅游东方绿舟旅游锦江乐园旅游嶂石岩旅游张河湾水库旅游苍岩山旅游荆州古城旅游百步云梯旅游梦笔生花旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘