精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++的另一種錯誤處理策略

開發 后端
這篇短文是討論一個大多數程序員都感興趣的一個話題:錯誤處理。錯誤處理是編程的一個“黑暗面”。它既是應用程序的“現實世界”的關鍵點,也是一個你想隱藏的復雜業務。

這篇短文是討論一個大多數程序員都感興趣的一個話題:錯誤處理。錯誤處理是編程的一個“黑暗面”。它既是應用程序的“現實世界”的關鍵點,也是一個你想隱藏的復雜業務。

在早期的C編程生涯中,我知道三種錯誤處理的方式。

C語言的方式:返回錯誤碼

C語言風格的錯誤處理是最簡單的,但是并不***。

C語言風格的錯誤處理依賴于“當程序遇到錯誤時返回一個錯誤碼”。這里是一個簡單的例子:

  1. int find_slash(const char *str) 
  2.     int i = 0; 
  3.    
  4.     while (str[i] && str[i] != '/'
  5.           i++; 
  6.    
  7.     if (str[i] == '\0'
  8.         return -1; //Error code 
  9.    
  10.     //True value 
  11.     return i; 
  12.    
  13. // . . . 
  14.    
  15. if (find_slash(string) == -1) 
  16.         //error handling 

使用這種方式的有什么好處?

你可以在調用函數之后直接處理錯誤碼(在C語言中,你也會這樣處理),顯示一個錯誤消息或者直接終止程序。或者僅僅恢復程序最近的一個狀態,終止計算。

當你找不到錯誤處理在哪里的時候,你只需要后頭看看函數調用,錯誤處理就在那個附近。

使用這種方式有什么不好?

有人可能會告訴你,這種異常/錯誤處理方式和“執行邏輯”混在了一起。當你順序地閱讀這些代碼的時候就行程序執行一樣,你看到了一會錯誤處理,一會程序執行。這樣很糟糕,你可能更喜歡只讀程序執行邏輯或者錯誤處理邏輯。

并且你被限定使用錯誤碼,如果你想要提供更多的信息,你需要創建一些功能函數比如:errstr或者提供全局變量。

使用C++的方式

C++作為對C的增強,引入了一種新的錯誤處理方式——異常。異常通過拋出一個錯誤的方式來中斷正常代碼執行邏輯,并可以被其他地方所捕獲。下面是一個簡單的例子:

  1. int find_slash(const char *str) 
  2.     int i = 0; 
  3.    
  4.     while (str[i] && str[i] != '/'
  5.           i++; 
  6.    
  7.     if (str[i] == '\0'
  8.         throw AnException("Error message"); 
  9.    
  10.     //True value 
  11.     return i; 
  12.    
  13. // . . . 
  14.    
  15. try 
  16.     find_slash(string); 
  17. catch(AnException& e) 
  18.    //Handle exception 

這樣做的好處?

程序邏輯和錯誤處理分離了。一邊你可以看到函數是如何工作的,而另一邊你可以看到函數失敗時候是怎么處理的。這樣做很***,可以很容易看出錯誤處理和正常程序邏輯。

另外,現在你可以為你的錯誤提供你需要的盡可能多的信息,因為你可以將需要的內容填充在自定義異常對象里。

這樣做的壞處

編寫詳盡的異常處理變得很冗。你需要一個異常樹,但是***不要太大,這樣,你可以選擇捕獲感興趣的異常。同時,內部需要提供錯誤碼,來獲知究竟發生了什么,同時需要檢索一些錯誤消息,等等。編寫寫異常類通常都是冗長,這是將信息嵌入到錯誤里來靈活處理更多的信息的成本。

這里的錯誤處理哲學是將錯誤盡可能推遲到需要處理的地方再處理,當你不知道程序執行過程究竟哪里會產生一個錯誤,你需要跳過不同的文件和功能函數來 查找,這通常都是困難的,如果你在一個很深的調用樹(這里意思是當你將函數調用繪制出一個圖形,其形狀類似一棵樹)上引發了一個異常,你需要指定在哪里來 處理這個異常,當它被處理的時候,它又是在哪里發生的。特別是當你的程序很大,又是很早之前編寫,有恰巧設計不夠良好的時候,就更加顯得困難。而大多數商 業項目都是這樣。

所以我覺得“異常是危險的”。雖然它提供了一種良好的方式來處理錯誤——僅限于一些小項目,并且這里的調用圖簡單且易于掌握時候。

#p#

錯誤封裝的模式

我這里把它叫做一種模式,所以人們不必害怕擔心。后面,我會給它一種更好的命名,所以請不要著急。

錯誤封裝的主旨是創建一種封裝來包含錯誤消息或者錯誤的返回值。我們通常會選擇字符串而不是其他,因為這也并不容易實現。我們盡力保證語法的可讀性,可理解,并且容易應用。我們不處理拷貝構造或者多參數函數及返回值,這里僅給出一個盡可能簡單的例子。

讓我們以下面的例子開始:

  1. E<int> find_slash(const char* str) 
  2.     int i = 0; 
  3.    
  4.     while (str[i] && str[i] != '/'
  5.           i++; 
  6.    
  7.     if (str[i] == '\0'
  8.         return fail<int>("Error message"); 
  9.    
  10.     //True value 
  11.     return ret(i); 
  12.    
  13. // . . . 
  14.    
  15. auto v = find_slash(string); 
  16. if(!v) 
  17.     //Handle exception 
乍一看,這里有點類似C語言的風格,但是不是,為表明這一點,請看接下來的多個函數調用例子:
  1. E<int> find_slash(const char*); 
  2. E<int> do_some_arithmetic(int); 
  3. E<std::string> format(int); 
  4. E<void> display(std::string); 
  5.    
  6. auto v = ret(string) 
  7.          .bind(find_slash) 
  8.          .bind(do_some_arithmetic) 
  9.          .bind(format) 
  10.          .bind(display); 
  11.    
  12. if(!v) 
  13.     //Handle error 

好了,這里發生了什么?bind是一個成員函數來綁定你的函數調用,試著去應用它。如果錯誤裝箱里面含有一個值,那么它就應用于函數調用,繼續返回一個錯誤裝箱(編譯器不允許你返回一個不帶錯誤裝箱的函數)。

所以,我們鏈式調用了find_slashe,do_some_arithmetic, format和display.它們都不處理錯誤裝箱,由于bind函數的作用,我們將函數E<something_out> f(something_in)返回結果給E<something_out> f(E<something_in>)函數做參數。

這里的好處是什么?

再一次,函數邏輯(調用鏈)和錯誤處理分離了。和異常一樣,我們可以簡單讀一下函數調用鏈來了解代碼邏輯,而不用關心執行是在哪里被中斷的。事實上,函數調用鏈可以在任何調用時被中斷。但是我們可以認為沒有錯誤發生,如果我們的邏輯是正確的,可以很快速檢查。

當然,類型推導會阻止你在調用display之后繼續進行綁定。所以我們也沒有失去類型能力。

注意,我們沒有在其他地方調用這些函數,我們在***將這些方法組裝在一起。這里是關鍵,你應該編寫一些小的模塊函數(另外,注意:你應該編寫模板函 數使其工作)接收一個值,然后計算一個新值或者返回失敗。在每一步中,你都不需要考慮可能出現錯誤導致你的控制流中斷,并且校驗你是否在一個有效的狀態上 (異常安全基于查詢每個函數調用,指出函數是否中斷你的控制流程,如果出現異常會發生什么),基于這一點,這樣做更安全。

和異常一樣,我們可以處理很詳細的信息,盡管這里我們編寫的是一個偏模板函數,所以也容易理解一些。

我們可以很容易放置異常處理邏輯,把它放在函數調用鏈之后(除非這個返回值還需要進一步被鏈接)。現在,我們有一個大的的執行流,沒有中斷,使用小 的函數處理流程,容易定位。當需要添加一個新的錯誤時,你只需找到那些函數,通過函數調用鏈,你可以直接定位到處理位置,并根據需要添加。大型項目變得更 加的線性化,并且更易讀。

這樣做有什么不足?

首先,這是一個新的處理方式,并且和C++的方式不兼容。這不是一個標準處理方法,當你使用stl時,你仍然需要使用異常。

對于我來說,這樣做還是有點冗長。需要顯式編寫fail<int>(…)的模板推導顯得有點怪異,如果你有個多態錯誤類型就更糟了,你不得不這樣寫fail<return_type, error_type>("...").

當函數有多個參數時編寫也很困難,在其他一些語言中,可以使用適用類型和抽象類型很好地解決這個問題,不過這在C++中不會提供。我想更適合使用bind2(E<a>, E<b>, f)bind3(E<a>, E<b>, E<c>, f),可變模板參數功能更有用。

為獲取封裝錯誤中的值,我們需要檢查這個值是否是有效值,接著調用一個“to_value”方法。我們沒辦法不通過檢查來做到這一點。我們希望的是“解構”一個對象,不過這在C++中不支持,這也不是一些可以說“我們把它加入到下一個標準”的特性。

目前為止,我不知道讀者是否有方法將其適配到成員函數中,如果你有想法,請測試一下,如果可以,請告知我們。

實現原子錯誤處理

我實現了它,我定義了這個黑魔法的名字——“原子化”,你可以認為“原子化”是一個對值和錯誤上下文的裝箱,比如,一個box包含一個值或者什么也不包含是一個原子組(這里作為一個練習,你可以試著實現一下)。

有點奇怪的是,從某個角度來說隊列是一個原子組,他們擁有一個上下文的值。

讓我們從上面的E模版類實現開始,這里使用了C++11標準中的decltype和auto -> decltype類型,允許自動推導得到表達式的類型,這非常有用。

這里的bind函數有點怪異,但是他實現了我剛才提到的內容。

原文鏈接:http://zenol.fr/site/2013/08/27/an-alternative-error-handling-strategy-for-cpp/

譯文鏈接:http://blog.jobbole.com/54699/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2018-04-18 07:34:58

2014-09-17 14:37:06

2013-05-22 15:31:07

AOP的CGlib實現

2016-03-03 10:29:31

用戶信息改進

2010-07-21 16:23:09

運行telnet程序

2011-12-29 21:28:31

Metro UI

2023-06-18 23:19:17

ChatGPTPPT方式

2016-07-11 16:18:26

互聯網

2019-01-02 08:04:29

GAN損失函數神經網絡

2013-09-30 10:13:08

IT女程序員

2011-07-21 14:17:15

Ceylon

2015-07-28 13:36:04

2010-09-02 09:14:35

CSS浮動

2009-06-17 09:05:05

Linux隱藏網絡鏈接命令

2013-10-21 15:11:15

OrmsqlOrm設計

2009-06-17 12:01:21

Linux

2013-09-12 14:26:47

百度云網盤

2010-06-09 16:17:20

TCP IP協議網絡故

2019-03-17 15:59:05

Android PAPIAPP

2009-04-01 08:27:07

Opera瀏覽器
點贊
收藏

51CTO技術棧公眾號

欧美 日韩 国产 成人 在线| 精品少妇爆乳无码av无码专区| 成人精品国产| 亚洲精品免费在线观看| 91av一区二区三区| 成人免费在线视频播放| 姝姝窝人体www聚色窝| 玖玖国产精品视频| 九九精品在线视频| 国产精品密蕾丝袜| 99ri日韩精品视频| 欧美色窝79yyyycom| 一卡二卡三卡视频| 99riav在线| 99久久精品国产毛片| 国产在线精品一区免费香蕉| 91在线看视频| 欧美xxx在线观看| 国产丝袜精品第一页| 红桃视频一区二区三区免费| 国产精品久久久久av电视剧| 亚洲午夜精品网| 水蜜桃一区二区三区| 四虎永久在线观看| 国产一区二区不卡| 青青久久aⅴ北条麻妃| 天天干中文字幕| 国产一区二区三区电影在线观看 | 三级欧美日韩| 欧美日韩在线播放| 国产av无码专区亚洲精品| 日本大片在线播放| 亚洲男同1069视频| 亚洲国产午夜伦理片大全在线观看网站| 风流少妇一区二区三区91| 国产一区二区调教| 国产精品久久色| 伊人中文字幕在线观看| 亚洲免费播放| 久久久亚洲福利精品午夜| 国产一二三区精品| 国产精品久久久久久久| 中文字幕免费精品一区| 亚洲一区二区自偷自拍| 欧美日韩精品一区二区三区在线观看| 日韩精品一区二区三区老鸭窝| 少妇一级淫免费播放| 亚洲精品.com| 欧美综合在线视频| 久久久精品麻豆| 欧美日韩精品免费观看视完整| 狠狠操狠狠色综合网| 国产一区二区三区精彩视频| 在线天堂资源| 欧美性猛交99久久久久99按摩| 久久久一本二本三本| 草草在线视频| 欧美性猛交xxxx黑人| 91av资源网| 欧美性suv| 欧美三级电影在线观看| 中文字幕亚洲欧洲| 精品久久免费| 欧美精品一区二区三区在线播放| 亚洲熟女一区二区| 在线成人动漫av| 一区二区三区视频观看| 欧美日韩国产一二三区| 91精品国产91久久综合| 欧美激情小视频| 久久久午夜影院| 视频一区免费在线观看| 成人疯狂猛交xxx| www.av导航| 99亚偷拍自图区亚洲| 欧美人xxxxx| 91九色在线porn| 一区二区三区在线观看国产| 国产96在线 | 亚洲| 日韩精品99| 欧美喷潮久久久xxxxx| 三上悠亚 电影| 真实原创一区二区影院| 久久精品99久久香蕉国产色戒| 一区二区成人免费视频| 一本色道久久综合亚洲精品不| 日本不卡高字幕在线2019| 在线免费观看一区二区| 丰满放荡岳乱妇91ww| 欧美日韩亚洲一区二区三区四区| av电影在线观看| 亚洲一区精品在线| 爆乳熟妇一区二区三区霸乳| 精品中文字幕一区二区三区四区 | 国产精品视频二区三区| 中文字幕亚洲在| 欧美 日本 亚洲| 成人久久精品| 亚洲男子天堂网| 印度午夜性春猛xxx交| 久久婷婷丁香| 超碰97在线资源| www.在线播放| 亚洲成人黄色影院| 亚洲理论中文字幕| 亚洲aa在线| 欧美俄罗斯乱妇| 中文字幕欧美在线观看| 成人丝袜高跟foot| 伊人情人网综合| 黑森林国产精品av| 欧美一级精品在线| 农村老熟妇乱子伦视频| 亚洲精品极品| 999精品视频一区二区三区| 粉嫩一区二区三区国产精品| 午夜成人在线视频| 女人扒开腿免费视频app| 欧美午夜精彩| 欧美综合在线第二页| 精品人妻久久久久一区二区三区| 欧美国产日本韩| 国模吧无码一区二区三区| 亚洲1区在线观看| 北条麻妃久久精品| 99re热视频| 久久精品一区二区| 日本三级免费网站| 思热99re视热频这里只精品| 欧美大片在线免费观看| 国产精品一区二区人人爽| 国产日韩精品视频一区| 国产成人精品视频免费看| 日韩精品中文字幕吗一区二区| 色七七影院综合| 姑娘第5集在线观看免费好剧| 91在线观看视频| 无码av天堂一区二区三区| 在线观看视频一区二区三区| 蜜臀久久99精品久久久久久宅男| 一级黄色大毛片| 国产无一区二区| 欧美激情国产精品日韩| 欧美午夜寂寞| 日本精品视频在线观看| 日产精品久久久久久久性色| 图片区小说区国产精品视频| 无码任你躁久久久久久老妇| 亚洲福利一区| 精品久久久久久综合日本| av福利在线导航| 日韩av中文字幕在线| 精品在线播放视频| 久久久午夜精品| 激情 小说 亚洲 图片: 伦| 色999国产精品| 成人福利免费观看| 在线视频观看国产| 欧美videossexotv100| 久久精品人妻一区二区三区| 成人av动漫在线| 日本久久久精品视频| 国产一区二区在线| 成人黄色网免费| 午夜成年人在线免费视频| 亚洲国产另类 国产精品国产免费| 国产一级一片免费播放放a| av在线不卡电影| 国产三级日本三级在线播放| 久久在线电影| 成人免费在线一区二区三区| 亚洲欧美电影| 最近2019好看的中文字幕免费| 国产一区二区小视频| 一区二区三区国产| 日韩精品卡通动漫网站| 麻豆精品一区二区综合av| 超碰人人爱人人| 亚州综合一区| 国产在线观看不卡| 国产精品一区二区日韩| 一道本无吗dⅴd在线播放一区| 亚洲在线视频播放| 偷偷要91色婷婷| 亚洲一二三在线观看| 国产又粗又猛又爽又黄91精品| 久久亚洲精品无码va白人极品| 国产伦精品一区二区三区千人斩| 成人在线精品视频| 国产精品yjizz视频网| 日韩一区二区在线视频| 色噜噜在线播放| 欧美日韩一本到| 国产精品老女人| 中文字幕色av一区二区三区| 日韩免费高清一区二区| 精品一区二区三区免费| 日韩欧美国产免费| 午夜精彩国产免费不卡不顿大片| 久久久综合亚洲91久久98| av国产精品| 日韩av免费在线看| 国内高清免费在线视频| 色青青草原桃花久久综合| 先锋av资源站| 日韩一区二区在线看片| 亚洲毛片一区二区三区| 亚洲国产日韩精品| 国产极品美女在线| 日本一区二区综合亚洲| bt天堂新版中文在线地址| 亚洲最大在线| 国产有色视频色综合| 国产一区二区视频在线看| 国产suv精品一区二区三区88区| 日韩激情av| 精品国产一区二区在线| 久久综合九色综合久| 精品国产91九色蝌蚪| 国产欧美一级片| 欧美高清视频不卡网| 日本黄色中文字幕| 色综合久久天天综合网| 日韩成人免费观看| 一区二区免费在线| 中文字幕电影av| 欧美国产日产图区| 天天干天天舔天天操| 久久久不卡影院| 91av在线免费| 99精品在线观看视频| 国产精品扒开腿做爽爽爽a片唱戏| 国产一区二区三区av电影| www.久久久精品| 日本亚洲最大的色成网站www| 黄色动漫网站入口| 国产精品久久久久9999高清| 给我免费播放片在线观看| 午夜精品网站| 97超碰国产精品| 亚洲性图久久| 人妻av中文系列| 亚洲精选在线| 99精品在线免费视频| 久久国产主播| 欧美一级裸体视频| 蜜臀av性久久久久蜜臀av麻豆| 九九热在线免费| 蜜臀精品久久久久久蜜臀| 久热精品在线观看视频| 国产一区美女在线| 国产精品一区二区在线免费观看| 国产成人三级在线观看| 性活交片大全免费看| 91影院在线观看| 久久中文字幕人妻| 中文字幕欧美激情| 欧美美女性生活视频| 亚洲另类在线制服丝袜| 国产在线观看你懂的| 欧美日韩在线视频首页| av黄色在线播放| 欧美日韩在线三区| 国产视频一区二区三区四区五区| 日韩女优制服丝袜电影| 日韩一区二区三区在线观看视频 | 亚洲香蕉中文网| 久久综合久久鬼色| 任我爽在线视频| 亚洲午夜精品17c| 亚洲s码欧洲m码国产av| 欧美日韩精品一区二区在线播放| 国产三级三级在线观看| 亚洲第一天堂av| 国产人成在线视频| 美女999久久久精品视频| 理论片午夜视频在线观看| 国产97在线|亚洲| 精品成人18| 欧美一区二区三区四区夜夜大片| 欧美a级成人淫片免费看| 国产乱子伦精品无码专区| 日韩av不卡在线观看| 交换做爰国语对白| 久久欧美中文字幕| av激情在线观看| 色综合久久综合网97色综合 | 先锋影音欧美| 国内精品亚洲| 91最新在线观看| 成人免费毛片高清视频| 亚洲最大成人综合网| 亚洲一区在线观看视频| 糖心vlog精品一区二区| 精品福利一区二区三区| 秋霞午夜理伦电影在线观看| 7777精品久久久久久| 在线一区视频观看| 国产一级精品aaaaa看| 日韩欧美视频专区| 欧洲黄色一级视频| 丰满放荡岳乱妇91ww| 男女全黄做爰文章| 精品色蜜蜜精品视频在线观看| 国产手机精品视频| 一区二区三区美女xx视频| 国产网站在线| 91精品网站| 久久一区二区中文字幕| 国产肥臀一区二区福利视频| 国产·精品毛片| 中文字幕资源站| 色婷婷激情综合| 少妇精品高潮欲妇又嫩中文字幕 | 亚洲国产精品热久久| 国产精品va在线观看视色| 日韩免费不卡av| 欧美jizz19性欧美| 一本久道高清无码视频| 国产乱码精品一区二区三区av | 国产a∨精品一区二区三区不卡| 亚洲一区二区三区中文字幕在线观看 | av天堂永久资源网| av色综合久久天堂av综合| jizz亚洲少妇| 91精品国产综合久久久久久久 | 中文字幕一区av| 一区二区三区在线免费观看视频| 亚洲欧美成人在线| 亚洲美女炮图| 九色综合日本| 日韩一级网站| 日本黄色片在线播放| 午夜精品福利视频网站| 成人小说亚洲一区二区三区| 欧美日韩电影在线观看| 69精品国产久热在线观看| 国产911在线观看| 国产老女人精品毛片久久| 我要看黄色一级片| 欧美一区二区在线免费播放| 黄色成人在线| 91久久精品国产91久久性色tv| 亚洲91视频| 亚洲美女精品视频| 亚洲成人自拍偷拍| 视频一区 中文字幕| 97人人做人人爱| 婷婷亚洲精品| 另类小说第一页| 亚洲视频综合在线| www.久久精品.com| 97在线视频观看| 一本色道久久综合狠狠躁的番外| 免费在线观看毛片网站| 国产三级欧美三级日产三级99| 中文字幕一区二区三区四区视频 | 蜜桃视频免费观看一区| 男女全黄做爰文章| 欧美不卡一区二区三区四区| 2021天堂中文幕一二区在线观| 久久99久久精品国产| 久久久水蜜桃av免费网站| 一道本在线观看| 欧美精品日韩精品| 久久亚洲导航| 欧美xxxx黑人又粗又长密月| 日韩高清在线不卡| 成人自拍小视频| 亚洲国产97在线精品一区| 日韩影片中文字幕| 午夜啪啪福利视频| 成人a免费在线看| 国产又粗又猛又爽又| 久久精品一本久久99精品| jizz国产精品| 日韩中文字幕组| 亚洲精品视频在线观看网站| 婷婷在线观看视频| 国产精品免费看久久久香蕉| 在线成人直播| 免费黄色在线视频| 欧美电影一区二区三区| 交100部在线观看| 亚洲免费视频一区| 成人性生交大合| 在线观看亚洲黄色| 欧美精品电影免费在线观看| 国产精品片aa在线观看| 波多野结衣在线免费观看| 欧美视频二区36p| 成人在线观看亚洲| 久久综合九九| 国产成人免费在线观看不卡| 日韩免费av网站| 国内精品视频久久| 午夜免费一区| 久久久久亚洲av无码a片| 欧美mv和日韩mv国产网站| 99久久er|