精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产毛片毛片毛片毛片| 欧美精品1区2区3区| 亚洲精品电影网| 五码日韩精品一区二区三区视频| 欧美人妻一区二区| 久久av日韩| 亚洲女人av| 欧美成人伊人久久综合网| 亚洲不卡1区| 国产亚洲精品码| www.久久久.com| 国产精品视频一二三区 | 每日更新在线观看av| 国产在线|日韩| 91美女视频网站| 97在线视频免费| 无码一区二区精品| av中文字幕在线看| 丁香一区二区三区| 欧美黄色免费网站| 精品国产免费久久久久久婷婷| 欧美13一16娇小xxxx| 美美哒免费高清在线观看视频一区二区| 日韩高清av一区二区三区| 国产婷婷一区二区三区| 神马午夜在线观看| 国产日韩一区| 亚洲欧洲高清在线| 亚州精品一二三区| 日本在线视频观看| 老司机精品视频一区二区三区| 久久久久久久久电影| 精品人妻一区二区三区日产| 久久久久伊人| 色8久久精品久久久久久蜜| 欧美连裤袜在线视频| 无码免费一区二区三区| 日韩精品一卡| 欧美一区二区不卡视频| 国产精品第157页| 天天干天天摸天天操| 国产精品一品视频| 97视频在线观看免费高清完整版在线观看 | 是的av在线| 久久蜜桃av一区精品变态类天堂 | 亚洲乱码一区二区三区| 日韩a在线观看| 日日夜夜免费精品视频| 日韩在线精品一区| 中国老熟女重囗味hdxx| 超碰资源在线| 中文字幕第一区综合| 美女视频久久| 97人妻精品一区二区三区软件 | 中文字幕av一区二区三区谷原希美| 精品日韩久久久| 欧美色999| 亚洲美女视频在线| 精品久久久久久中文字幕动漫| 国产原创视频在线| 国产精品国产一区| 亚洲国产精品电影在线观看| 久久人妻精品白浆国产 | 精品伊人久久| 亚洲va中文字幕| 深田咏美在线x99av| 成人性生交大片免费看午夜| 国产.精品.日韩.另类.中文.在线.播放| 91成人国产在线观看| jizzjizzjizz国产| 国内精品免费| 欧美在线看片a免费观看| 少妇久久久久久被弄到高潮| 欧美日本韩国一区二区| 久久久久久久综合色一本| 91成人免费看| 五月婷婷激情五月| 亚洲天堂男人| 日韩一区av在线| 亚洲第九十七页| 精品国产三级| 精品日韩在线一区| av免费一区二区| 成人香蕉视频| 亚洲动漫第一页| 男插女免费视频| 久蕉在线视频| 99国产精品久久久久久久久久久 | 男人天堂av在线播放| 欧美不卡一区| 日韩最新在线视频| 久久综合亚洲色hezyo国产| 一区二区三区高清视频在线观看| 欧美另类在线播放| аⅴ天堂中文在线网| 欧美福利在线播放网址导航| 日韩午夜中文字幕| 中文字幕一区二区三区四区在线视频| 精精国产xxxx视频在线播放| 91福利在线导航| 手机看片国产精品| 亚洲精品蜜桃乱晃| 亚洲福利在线视频| 中文字幕伦理片| 亚洲欧美一区在线| 国产99久久精品一区二区永久免费 | 欧美男插女视频| 国产一级精品视频| 在线不卡亚洲| 国内精品在线一区| 久久免费在线观看视频| 免费在线成人| 波多野结衣精品久久| 91国内精品视频| 欧美bbbbb| 国内外成人免费激情在线视频 | 亚洲一区日本| 亚洲综合在线小说| 国产精品一区二区三区在线免费观看 | 一区二区高清免费观看影视大全| 亚洲一区二区三区在线观看视频| eeuss影院www在线播放| 亚洲国产精品久久久久婷婷884 | 国精产品一区一区三区四川| 亚洲大胆人体视频| 91九色丨porny丨极品女神| 欧美第一精品| 欧美xxxx做受欧美| 精品一级少妇久久久久久久| 久久国内精品视频| 日本高清不卡三区| 一级毛片视频在线| 色综合天天综合在线视频| 欧美少妇性生活视频| 高清日韩欧美| 九九综合九九综合| 国产美女自慰在线观看| 国产精品人成在线观看免费| 成人免费看片视频在线观看| 韩国成人在线| 亚洲图片欧洲图片av| 美国一级片在线观看| 欧美久久成人| 欧美中文在线观看| 在线免费观看高清视频| 国产精品综合一区二区| 亚洲欧洲精品一区二区| 78精品国产综合久久香蕉| 91精品国产一区二区三区香蕉| 久久婷婷五月综合| 欧美在线亚洲| 亚洲最大的免费| 成人18视频| 国产又黄又爽又色| 成人av网站免费| 国产一区视频观看| 大胆av不用播放器在线播放| 日韩欧美一区二区三区| 色播五月综合网| 日韩影片在线观看| 亚洲欧美制服第一页| 天天做天天爱夜夜爽| 99精品偷自拍| 日韩网址在线观看| 国产高清视频一区二区| 日韩精品福利在线| 日韩色图在线观看| 久久久久久免费网| 在线观看免费黄网站| 久久五月天小说| 亚洲最大的网站| 91资源在线观看| 国产丝袜一区二区| 欧美成欧美va| 日韩专区一卡二卡| 亚洲mv在线看| 久久丁香四色| 午夜精品久久久久久久99黑人| 五月色婷婷综合| 亚洲人亚洲人成电影网站色| 最近免费中文字幕中文高清百度| 精品久久久久久久| 7777kkkk成人观看| 黄色在线播放| 4hu四虎永久在线影院成人| 日韩av在线看免费观看| 红桃视频国产一区| 久久综合福利| 福利精品一区| 久久久久久美女| 成人亚洲综合天堂| 亚洲精品一区二区精华| 亚洲成人生活片| 暴力调教一区二区三区| 免费的av在线| 在线欧美激情| 97精品国产97久久久久久| 懂色一区二区三区| 色久综合一二码| 成人免费视频网站入口::| 97精品久久久久中文字幕| 亚洲视频一二三四| 国产欧美激情| 中国一级黄色录像| 蜜臀av免费一区二区三区| 2018日韩中文字幕| 黄网页在线观看| 3d动漫精品啪啪| www欧美在线| 亚洲精品国产无天堂网2021 | 欧美一区二区成人6969| 五月天激情国产综合婷婷婷| 中文字幕一区二区三区不卡| 国产免费又粗又猛又爽| 最新成人av网站| 激情欧美一区二区三区中文字幕| 欧美xxxx性| 热re99久久精品国产66热| 色屁屁www国产馆在线观看| 日韩美女视频在线| a片在线免费观看| 亚洲国产精品二十页| 欧美日韩一区二区三区四区五区六区| 国产一区美女| 亚洲欧美精品| 奇米色欧美一区二区三区| 国产欧美日韩亚洲| 欧美日韩黄网站| 国产在线精品一区免费香蕉| 动漫一区在线| 精品久久久久久久久久久院品网| 中文字幕+乱码+中文字幕明步 | 欧美14一18处毛片| 亚洲第一国产精品| 精品国产18久久久久久| 亚洲成人激情av| 欧美日韩亚洲国产另类| 最新国产成人在线观看| 特级特黄刘亦菲aaa级| 亚洲自啪免费| 无码粉嫩虎白一线天在线观看 | 久久免费播放视频| 亚洲精品综合在线| 欧美 日韩 国产 一区二区三区| 国产精品丝袜一区| 婷婷综合在线视频| 中文字幕成人av| 日韩av片在线| 中文字幕一区二区不卡| 视频国产一区二区| 中文字幕日韩精品一区| 亚洲欧美卡通动漫| 大美女一区二区三区| 丰满人妻一区二区三区大胸| 国产精品18久久久久久久久| 欧美丰满熟妇bbbbbb百度| 日韩欧美高清| 亚洲欧美国产不卡| 希岛爱理av一区二区三区| 精品国产一区二区三区麻豆免费观看完整版 | 婷婷激情综合网| 精品一区二区三区蜜桃在线| 国产三级一区二区| 成人国产精品av| 亚洲av综合色区无码另类小说| 国产欧美亚洲一区| 日韩av黄色网址| 亚洲成人一区| 法国空姐在线观看免费| 欧美一区影院| 日韩成人三级视频| 亚洲一区欧美激情| 爱情岛论坛vip永久入口| 久久成人久久鬼色| 久久精品香蕉视频| 日本午夜精品一区二区三区电影| 日韩大片一区二区| 国产精品一二三在| 91传媒理伦片在线观看| 久久午夜国产精品| 99热99这里只有精品| 一区二区三区精品在线观看| 日本一二三区视频| 亚洲码国产岛国毛片在线| 妺妺窝人体色www婷婷| 精品国产91乱高清在线观看| 波多野结衣黄色| 91精品在线麻豆| 人妻一区二区三区免费| 欧美一区二区美女| 蜜桃av中文字幕| 一区二区成人精品| 可以在线观看的黄色| 色先锋资源久久综合5566| 亚洲妇熟xxxx妇色黄| 国产69久久精品成人| 国内小视频在线看| 欧美精品在线视频观看| 成年女人在线看片| 91精品久久久久久久久不口人| 66精品视频在线观看| 亚洲伊人成综合成人网| www.视频在线.com| 久久久99久久| 糖心vlog免费在线观看| 五月天丁香久久| 91精品国自产| 精品亚洲精品福利线在观看| 日本三级在线播放完整版| 韩国视频理论视频久久| 日韩电影精品| 国产精品亚洲片夜色在线| 天天综合网天天| 91免费国产网站| 亚洲精品777| 久久亚洲一区二区| 欧美激情第10页| 中文字幕第36页| 成人av在线电影| 免费在线观看黄色小视频| 色屁屁一区二区| 免费国产精品视频| 久久人人爽亚洲精品天堂| 国产在线观看黄| 欧美高清自拍一区| 久久亚洲资源中文字| 玖玖玖精品中文字幕| 很黄很黄激情成人| 欧洲美女亚洲激情| 国产一区二区不卡老阿姨| 欧美日韩一区二区三| 欧美黄在线观看| 性欧美在线视频| 国产精品一区二区你懂的| 日本少妇高潮喷水xxxxxxx| 国产精品天美传媒沈樵| 国产午夜性春猛交ⅹxxx| 精品日韩在线一区| dy888亚洲精品一区二区三区| 国产精品网红福利| 欧美色图国产精品| 精品国产一区二区三区在线| 美女视频黄 久久| 免费黄在线观看| 色婷婷综合久久久中文一区二区 | 欧美成人黑人| 国产精品一区=区| 欧美在线观看视频一区| 污污视频网站免费观看| 久久9热精品视频| www.日本高清视频| 欧美三级三级三级| 免费a级片在线观看| 欧美大学生性色视频| 亚洲亚洲一区二区三区| 欧美国产综合在线| 成人福利视频网站| 国产又黄又爽又色| 亚洲欧美日韩一区在线| 大片免费在线看视频| 成人写真福利网| 欧美成人有码| 色哟哟无码精品一区二区三区| 午夜欧美大尺度福利影院在线看 | 成人午夜伦理影院| 懂色av.com| 精品亚洲一区二区三区在线观看| 综合日韩av| www 成人av com| 亚洲一级高清| 女~淫辱の触手3d动漫| 亚洲精选免费视频| 亚洲AV无码一区二区三区性| 中国人与牲禽动交精品| 国产精品麻豆成人av电影艾秋| 亚洲欧美国产不卡| 国产成人精品免费视频网站| 日本道在线观看| 国产亚洲欧洲在线| 国产日韩中文在线中文字幕| 日韩国产成人无码av毛片| 久久人人97超碰com| 亚洲一区二区三区高清视频| 欧美日韩成人免费| 最近国产精品视频| 看看黄色一级片| 亚洲丶国产丶欧美一区二区三区| 欧美日韩伦理片| 亚洲综合在线做性| 久久久一二三| 久久久久国产精品区片区无码| 日韩欧亚中文在线| 久久久久久久久免费视频| 国产精品二区三区| 99久久夜色精品国产亚洲狼| 在线观看一区二区三区视频| 色天使久久综合网天天| 羞羞的视频在线观看| 日本在线观看一区| 美女精品在线|