上一页 1 ··· 42 43 44 45 46 47 48 49 50 ··· 52 下一页
摘要: 在现在,软件变的越来越大,如果不用SEH,要实现完全强壮的应用程序简直是不可能的。我们先来看一个样板程序,即C的运行时函数strcpy:这是一个相当简单的函数,它怎么会引起一个进程结束呢?如果调用者对这些参数中的某一个传递NULL(或任何无效的地址),strcpy就引起一个存取异常,并且导致整个进程结束。使用SEH,就可以建立一个完全强壮的strcpy函数:char* RobustStrcpy(char* strDes, char* strSource){__try{strcpy(strDes, strSource);}__except(EXCEPTION_EXECUTE_HANDLER){f 阅读全文
posted @ 2009-03-27 15:18 andriod2012 阅读(149) 评论(0) 推荐(0) 编辑
摘要: *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 阅读全文
posted @ 2009-03-27 15:17 andriod2012 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 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 阅读全文
posted @ 2009-03-27 15:17 andriod2012 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 微软在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)函数,操作系统可以调用这些函数,保证异常块被处理。编译程序还要负责准备栈结构和其他内部信息,供操作系统使用和参考。在编译程序中 阅读全文
posted @ 2009-03-27 15:16 andriod2012 阅读(139) 评论(0) 推荐(0) 编辑
摘要: file://异常}catch (logic_error& ex) { // 处理所有其它的 ... // logic_errors异常}综上所述,把一个对象传递给函数或一个对象调用虚拟函数与把一个对象做为异常抛出,这之间有三个主要区别。第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象做为参数传递给函数时不需要被拷贝。第二、对象做为异常被抛出与做为参数传递给函数相比,前者类型转换比后者要少(前者只有两种转换形式)。最后一点,catch子句进行异常类型匹配的顺序是它们在源代码中出现的顺序,第一个类型匹配成功的catch将被用来执行。当一个对象调用一个虚 阅读全文
posted @ 2009-03-27 15:15 andriod2012 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 对象从函数的调用处传递到函数参数里与从异常抛出点传递到catch子句里所采用的方法不同,这只是参数传递与异常传递的区别的一个方面,第二个差异是在函数调用者或抛出异常者与被调用者或异常捕获者之间的类型匹配的过程不同。比如在标准数学库(the standard math library)中sqrt函数:double sqrt(double); // from <cmath> or <math.h>我们能这样计算一个整数的平方根,如下所示:int i;double sqrtOfi = sqrt(i);毫无疑问,C++允许进行从int到double的隐式类型转换,所以在sqrt 阅读全文
posted @ 2009-03-27 15:14 andriod2012 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 当异常对象被拷贝时,拷贝操作是由对象的拷贝构造函数完成的。该拷贝构造函数是对象的静态类型(static type)所对应类的拷贝构造函数,而不是对象的动态类型(dynamic type)对应类的拷贝构造函数。比如以下这经过少许修改的passAndThrowWidget:class Widget { ... };class SpecialWidget: public Widget { ... };void passAndThrowWidget(){ SpecialWidget localSpecialWidget; ... Widget& rw = localSpecialWidget; 阅读全文
posted @ 2009-03-27 15:12 andriod2012 阅读(156) 评论(0) 推荐(0) 编辑
摘要: }很多window系统有C-like接口,使用象like createWindow 和 destroyWindow函数来获取和释放window资源。如果在w对应的window中显示信息时,一个异常被抛出,w所对应的window将被丢失,就象其它动态分配的资源一样。解决方法与前面所述的一样,建立一个类,让它的构造函数与析构函数来获取和释放资源:file://一个类,获取和释放一个window 句柄class WindowHandle {public: WindowHandle(WINDOW_HANDLE handle): w(handle) {} ~WindowHandle() { destr. 阅读全文
posted @ 2009-03-27 15:11 andriod2012 阅读(134) 评论(0) 推荐(0) 编辑
摘要: bad_typeid 报告在表达式typeid(*p)中有一个空指针P④ 由runtime_error派生的异常range_error 报告违反了后置条件overflow_error 报告一个算术溢出bad_alloc 报告一个存储分配错误使用析构函数防止资源泄漏这部分是一个经典和很平常就会遇到的实际情况,下面的内容大部分都是从More Effective C++条款中得到的。假设,你正在为一个小动物收容所编写软件,小动物收容所是一个帮助小狗小猫寻找主人的组织。每天收容所建立一个文件,包含当天它所管理的收容动物的资料信息,你的工作是写一个程序读出这些文件然后对每个收容动物进行适当的处理(app 阅读全文
posted @ 2009-03-27 15:10 andriod2012 阅读(148) 评论(0) 推荐(0) 编辑
摘要: }} void main(){ ExceptionClass e("Test"); try{ e.mythrow(); } catch(...) { cout<<”*********”<<endl; }}这是输出信息:Construct TestConstruct my throwDestruct my throw****************Destruct my throw (这里是异常处理空间中对异常类的拷贝的析构)Destruct Test======================================不过一般来说我们可能更习惯 阅读全文
posted @ 2009-03-27 15:08 andriod2012 阅读(123) 评论(0) 推荐(0) 编辑
上一页 1 ··· 42 43 44 45 46 47 48 49 50 ··· 52 下一页