C++中审慎使用异常规格
£?o?óD??μ÷oˉêy????£? //????μ÷oˉêy?ü±?window?μí3?í?§×¢2á class CallBack { ??public: ????CallBack(CallBackPtr fPtr, void *dataToPassBack): func(fPtr), data(dataToPassBack) {} ????void makeCallBack(int eventXLocation, ????int eventYLocation) const throw(); ??private: ????CallBackPtr func; // function to call when ????// callback is made ????void *data; // data to pass to callback }; // function // ?aá?êμ????μ÷oˉêy£??ò??μ÷ó?×¢2áoˉêy£? //ê??tμ?×÷±êó?×¢2áêy?Y×??aoˉêy2?êy?£ void CallBack::makeCallBack(int eventXLocation,int eventYLocation) const throw() { ??func(eventXLocation, eventYLocation, data); } ?aà??úmakeCallBack?úμ÷ó?func£?òa?°?¥·′òì3£1???μ?·???£?òò?a?T·¨?aμàfunc?á?×3?ê2?′ààDíμ?òì3£?£ í¨1y?ú3ìDò?úCallBackPtr typedef?D2éó??ü????μ?òì3£1???à′?a???êìa£o typedef void (*CallBackPtr)(int eventXLocation,int eventYLocation,
?a?ù?¨ò?typedefoó£?è?1?×¢2áò????é?ü?á?×3?òì3£μ?callbackoˉêy??ê?·?·¨μ?£o // ò?????óDòì3£???÷μ???μ÷oˉêy
′?μYoˉêy????ê±??DD?a??òì3£1???μ??ì2é£?ê?ó???μ???D?μ?ì?D?£??ùò?óD?é?ü??μ?±àò??÷2??§3??a??ì?D??£è?1??ü??2??§3?£????íòà????×??oà′è·±£2??ü·??a??′í?ó?£ 避免调用unexpected的第三个方法是处理系统本身抛出的异常。这些异常中最常见的是bad_alloc,当内存分配失败时它被operator new 和operator new[]抛出。如果你在函数里使用new操作符,你必须为函数可能遇到bad_alloc异常作好准备。 现在常说预防胜于治疗(即做任何事都要未雨绸缪 译者注),但是有时却是预防困难而治疗容易。也就是说有时直接处理unexpected异常比防止它们被抛出要简单。例如你正在编写一个软件,精确地使用了异常规格,但是你必须从没有使用异常规格的程序库中调用函数,要防止抛出unexpected异常是不现实的,因为这需要改变程序库中的代码。 虽然防止抛出unexpected异常是不现实的,但是C++允许你用其它不同的异常类型替换unexpected异常,你能够利用这个特性。例如你希望所有的unexpected异常都被替换为UnexpectedException对象。你能这样编写代码:
通过用convertUnexpected函数替换缺省的unexpected函数,来使上述代码开始运行。: set_unexpected(convertUnexpected);
当你这么做了以后,一个unexpected异常将触发调用convertUnexpected函数。Unexpected异常被一种UnexpectedException新异常类型替换。如果被违反的异常规格包含UnexpectedException异常,那么异常传递将继续下去,好像异常规格总是得到满足。(如果异常规格没有包含UnexpectedException,terminate将被调用,就好像你没有替换unex |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |