快速业务通道

C++中审慎使用异常规格

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
£?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,
void *dataToPassBack) throw();

?a?ù?¨ò?typedefoó£?è?1?×¢2áò????é?ü?á?×3?òì3£μ?callbackoˉêy??ê?·?·¨μ?£o

// ò?????óDòì3£???÷μ???μ÷oˉêy
void callBackFcn1(int eventXLocation, int eventYLocation,
void *dataToPassBack);
void *callBackData;
...
CallBack c1(callBackFcn1, callBackData);
//′í?ó£?callBackFcn1?é?ü
// ?×3?òì3£
//′?óDòì3£1???μ???μ÷oˉêy
void callBackFcn2(int eventXLocation,
int eventYLocation,
void *dataToPassBack) throw();
CallBack c2(callBackFcn2, callBackData);
// ?yè·£?callBackFcn2
// ??óDòì3£1???

′?μ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对象。你能这样编写代码:

class UnexpectedException {}; // 所有的unexpected异常对象被
//替换为这种类型对象
void convertUnexpected() // 如果一个unexpected异常被
{
 // 抛出,这个函数被调用
 throw UnexpectedException();
}

通过用convertUnexpected函数替换缺省的unexpected函数,来使上述代码开始运行。:

set_unexpected(convertUnexpected);

当你这么做了以后,一个unexpected异常将触发调用convertUnexpected函数。Unexpected异常被一种UnexpectedException新异常类型替换。如果被违反的异常规格包含UnexpectedException异常,那么异常传递将继续下去,好像异常规格总是得到满足。(如果异常规格没有包含UnexpectedException,terminate将被调用,就好像你没有替换unex

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号