03 2009 档案
摘要:• ExceptionFlags包含有关异常的标志。当前只有两个值,分别是0(指出一个可以继续的异常)和E X C E P T I O N _ N O N C O N T I N U A B L E(指出一个不可继续的异常)。在一个不可继续的异常之后,若要继续执行,会引发一个E X C E P T I O N _ N O N C O N T I N U A B L E _E X C E P T I O N异常。• E x c e p t i o n R e c o r d指向另一个未处理异常的E X C E P T I O N _ R E C O R D结构。在处理一个异常的时候,有可能引发另
阅读全文
摘要:有可能发生在一个f i n a l l y块、一个异常过滤器、或一个异常处理程序里。当发生这种情况时,系统压栈异常。回忆一下G e t E x c e p t i o n I n f o r m a t i o n函数。这个函数返回EXCEPTION_ POINTERS结构的地址。E X C E P T I O N _ P O I N T E R S的E x c e p t i o n R e c o r d成员指向一个EXCEPTION_ R E C O R D结构,这个结构包含另一个E x c e p t i o n R e c o r d成员。这个成员是一个指向另外的E X C E P
阅读全文
摘要:下面的代码举例说明了一种方法,指出所发生异常的类别:BOOL Func_SEHExceptionGetCodeBase(){int x,y;__try{x = 0;y = 4/x;}__except((GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO) ? / EXCEPTION_EXECUTE_HANDLER :/ EXCEPTION_CONTINUE_SEARCH){file://handle divide by zero exception}}GetExceptionCode返回一个值,该值指出所发生异常的种类:下面列出所有预定义的异常
阅读全文
摘要:在现在,软件变的越来越大,如果不用SEH,要实现完全强壮的应用程序简直是不可能的。我们先来看一个样板程序,即C的运行时函数strcpy:这是一个相当简单的函数,它怎么会引起一个进程结束呢?如果调用者对这些参数中的某一个传递NULL(或任何无效的地址),strcpy就引起一个存取异常,并且导致整个进程结束。使用SEH,就可以建立一个完全强壮的strcpy函数:char* RobustStrcpy(char* strDes, char* strSource){__try{strcpy(strDes, strSource);}__except(EXCEPTION_EXECUTE_HANDLER){f
阅读全文
摘要:*lpAddress = ''''A''''; // <- Here, Will Happen a Access Exception! VirtualFree((LPVOID)lpAddress, 1024, MEM_RELEASE); return dwReturnValue;}DWORD Func_SEHTerminate(){DWORD dwReturnData = 0; HANDLE hSem = NULL;const char* lpSemName = "TermSem";hSem = Crea
阅读全文
摘要:finally块的总结性说明我们已经明确区分了强制执行f i n a l l y块的两种情况:• 从t r y块进入f i n a l l y块的正常控制流。• 局部展开:从t r y块的过早退出(g o t o、l o n g j u m p、c o n t i n u e、b r e a k、r e t u r n等)强制控制转移到f i n a l l y块。第三种情况,全局展开( global unwind),在发生的时候没有明显的标识,我们在本章前面Func_SEHTerminate函数中已经见到。在Func_SEHTerminate的t r y块中,有一个对TermHappenSo
阅读全文
摘要:微软在Wi n d o w s中引入S E H的主要动机是为了便于操作系统本身的开发。操作系统的开发人员使用S E H,使得系统更加强壮。我们也可以使用S E H,使我们的自己的程序更加强壮。使用S E H所造成的负担主要由编译程序来承担,而不是由操作系统承担。当异常块(exception block)出现时,编译程序要生成特殊的代码。编译程序必须产生一些表( t a b l e)来支持处理S E H的数据结构。编译程序还必须提供回调( c a l l b a c k)函数,操作系统可以调用这些函数,保证异常块被处理。编译程序还要负责准备栈结构和其他内部信息,供操作系统使用和参考。在编译程序中
阅读全文
摘要:file://异常}catch (logic_error& ex) { // 处理所有其它的 ... // logic_errors异常}综上所述,把一个对象传递给函数或一个对象调用虚拟函数与把一个对象做为异常抛出,这之间有三个主要区别。第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象做为参数传递给函数时不需要被拷贝。第二、对象做为异常被抛出与做为参数传递给函数相比,前者类型转换比后者要少(前者只有两种转换形式)。最后一点,catch子句进行异常类型匹配的顺序是它们在源代码中出现的顺序,第一个类型匹配成功的catch将被用来执行。当一个对象调用一个虚
阅读全文
摘要:对象从函数的调用处传递到函数参数里与从异常抛出点传递到catch子句里所采用的方法不同,这只是参数传递与异常传递的区别的一个方面,第二个差异是在函数调用者或抛出异常者与被调用者或异常捕获者之间的类型匹配的过程不同。比如在标准数学库(the standard math library)中sqrt函数:double sqrt(double); // from <cmath> or <math.h>我们能这样计算一个整数的平方根,如下所示:int i;double sqrtOfi = sqrt(i);毫无疑问,C++允许进行从int到double的隐式类型转换,所以在sqrt
阅读全文
摘要:当异常对象被拷贝时,拷贝操作是由对象的拷贝构造函数完成的。该拷贝构造函数是对象的静态类型(static type)所对应类的拷贝构造函数,而不是对象的动态类型(dynamic type)对应类的拷贝构造函数。比如以下这经过少许修改的passAndThrowWidget:class Widget { ... };class SpecialWidget: public Widget { ... };void passAndThrowWidget(){ SpecialWidget localSpecialWidget; ... Widget& rw = localSpecialWidget;
阅读全文
摘要:}很多window系统有C-like接口,使用象like createWindow 和 destroyWindow函数来获取和释放window资源。如果在w对应的window中显示信息时,一个异常被抛出,w所对应的window将被丢失,就象其它动态分配的资源一样。解决方法与前面所述的一样,建立一个类,让它的构造函数与析构函数来获取和释放资源:file://一个类,获取和释放一个window 句柄class WindowHandle {public: WindowHandle(WINDOW_HANDLE handle): w(handle) {} ~WindowHandle() { destr.
阅读全文
摘要:bad_typeid 报告在表达式typeid(*p)中有一个空指针P④ 由runtime_error派生的异常range_error 报告违反了后置条件overflow_error 报告一个算术溢出bad_alloc 报告一个存储分配错误使用析构函数防止资源泄漏这部分是一个经典和很平常就会遇到的实际情况,下面的内容大部分都是从More Effective C++条款中得到的。假设,你正在为一个小动物收容所编写软件,小动物收容所是一个帮助小狗小猫寻找主人的组织。每天收容所建立一个文件,包含当天它所管理的收容动物的资料信息,你的工作是写一个程序读出这些文件然后对每个收容动物进行适当的处理(app
阅读全文
摘要:}} void main(){ ExceptionClass e("Test"); try{ e.mythrow(); } catch(...) { cout<<”*********”<<endl; }}这是输出信息:Construct TestConstruct my throwDestruct my throw****************Destruct my throw (这里是异常处理空间中对异常类的拷贝的析构)Destruct Test======================================不过一般来说我们可能更习惯
阅读全文
摘要:这两天要处理一个异常的问题,刚好查了些相关的资料。在网上看到了一个不错的贴子,就转了过来,方便本人,以及来此旅游的朋友学习。源地址:http://www.host01.com/Print.html?91983,1异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小
阅读全文
摘要:看看这个如何在Gmail中插入简历照片(刚刚搞定 分享一下)Gmail发送邮件一般不会出什么问题,比如发送文字不能识别出现乱码等等,有些职位要求在邮件正文中粘贴上简历。刚刚搞定,跟大家分享一下...第一步:利用Google Docs服务建议一个新的文档,点击插入图像点击后如图,会出现如下图的界面,有多种选择,可以选择大小,图像位置,文字环绕等等,功能足够用了。第二步,插入后会在文档中出现图像 ,右击,选择复制图像第三步,在Gmail邮件正文中右击粘贴图片,出现如下图 ,可以在这里再次选择大小,就是图片下方的选项。希望对大家有所帮助。
阅读全文
摘要:C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这两种形式称为旧风格(old-style)的强制转型。使用标准C++的类型转换符:static_cast、dynamic_cast、reinterdivt_cast、和const_cast。3.1 static_cast用法
阅读全文