pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

我應該在 C++ 中使用異常說明符嗎?

Should I use an exception specifier in C++?(我應該在 C++ 中使用異常說明符嗎?)
本文介紹了我應該在 C++ 中使用異常說明符嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

在 C++ 中,您可以使用異常說明符指定函數可能會或可能不會引發異常.例如:

In C++, you can specify that a function may or may not throw an exception by using an exception specifier. For example:

void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type

我對實際使用它們持懷疑態度,原因如下:

I'm doubtful about actually using them because of the following:

  1. 編譯器并沒有真正以任何嚴格的方式強制執行異常說明符,因此好處并不大.理想情況下,您希望得到編譯錯誤.
  2. 如果函數違反了異常說明符,我認為標準行為是終止程序.
  3. 在 VS.Net 中,它將 throw(X) 視為 throw(...),因此對標準的遵守不強.

您認為應該使用異常說明符嗎?
請回答是"或否",并提供一些理由來證明您的回答是正確的.

Do you think exception specifiers should be used?
Please answer with "yes" or "no" and provide some reasons to justify your answer.

推薦答案

沒有

以下是幾個原因:

  1. 模板代碼不可能寫出異常規范,

  1. Template code is impossible to write with exception specifications,

template<class T>
void f( T k )
{
     T x( k );
     x.x();
}

副本可能會拋出,參數傳遞可能會拋出,x() 可能會拋出一些未知的異常.

The copies might throw, the parameter passing might throw, and x() might throw some unknown exception.

異常規范傾向于禁止可擴展性.

Exception-specifications tend to prohibit extensibility.

virtual void open() throw( FileNotFound );

可能演變成

virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );

你真的可以把它寫成

throw( ... )

第一個是不可擴展的,第二個是野心勃勃的,第三個是你真正的意思,當你寫虛函數時.

The first is not extensible, the second is overambitious and the third is really what you mean, when you write virtual functions.

舊代碼

當您編寫依賴于另一個庫的代碼時,您真的不知道當出現可怕的錯誤時它會做什么.

When you write code which relies on another library, you don't really know what it might do when something goes horribly wrong.

int lib_f();

void g() throw( k_too_small_exception )
{ 
   int k = lib_f();
   if( k < 0 ) throw k_too_small_exception();
}

g 將終止,當 lib_f() 拋出時.這(在大多數情況下)不是您真正想要的.std::terminate() 不應該被調用.讓應用程序因未處理的異常而崩潰,您可以從中檢索堆棧跟蹤,總比靜默/暴力死亡要好.

g will terminate, when lib_f() throws. This is (in most cases) not what you really want. std::terminate() should never be called. It is always better to let the application crash with an unhandled exception, from which you can retrieve a stack-trace, than to silently/violently die.

編寫返回常見錯誤并在異常情況下拋出的代碼.

Write code that returns common errors and throws on exceptional occasions.

Error e = open( "bla.txt" );
if( e == FileNotFound )
    MessageUser( "File bla.txt not found" );
if( e == AccessDenied )
    MessageUser( "Failed to open bla.txt, because we don't have read rights ..." );
if( e != Success )
    MessageUser( "Failed due to some other error, error code = " + itoa( e ) );

try
{
   std::vector<TObj> k( 1000 );
   // ...
}
catch( const bad_alloc& b )
{ 
   MessageUser( "out of memory, exiting process" );
   throw;
}

盡管如此,當您的庫只是拋出您自己的異常時,您可以使用異常規范來說明您的意圖.

Nevertheless, when your library just throws your own exceptions, you can use exception specifications to state your intent.

這篇關于我應該在 C++ 中使用異常說明符嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 杭州代理记账多少钱-注册公司代办-公司注销流程及费用-杭州福道财务管理咨询有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 数年网路-免费在线工具您的在线工具箱-shuyear.com | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 一航网络-软件测评官网| 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 |