锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
By 鍒樻湭楣?pongba)
C++鐨勭綏嫻(http://blog.csdn.net/pongba)
TopLanguage(http://groups.google.com/group/pongba)
寮曡█
閿欒澶勭悊錛圗rror-Handling錛夎繖涓噸瑕佽棰樹粠1997騫達紙涔熻鏇存棭錛夊埌2004騫村乏鍙充竴鐩存槸涓涓騫挎硾浜夎鐨勮瘽棰橈紝鏇懼湪鏂伴椈緇勪笂銆佸崥瀹笂銆佽鍧涗笂寮曞彂鍙f按鏃犳暟錛堜笉浜氫簬璇█涔嬩簤錛夛紝Bjarne Stroustrup銆丣ames Gosling銆丄nders Hejlsberg銆丅ruce Eckel銆丣oel Spolsky銆丠erb Sutter銆丄ndrei Alexandrescu銆丅rad Abrams銆丷aymond Chen銆丏avid Abrahams…錛屽悇璺浠欑悍綰峰嚭鍔紝濂戒笉鐑椆:-)
濡備粖浜夎铏界劧宸茬粡鍩烘湰緇撴潫騫剁粨鏋滐紱鍙笉榪囩粨璁烘暎钀藉湪澶ч噺鏂囩尞褰撲腑錛屼笖鏂版棫鏂囩尞闄堟潅錛屽鏋滈殢渚跨炕鐪嬪叾涓殑鍑犵瘒涔冭嚦鍑犲崄綃囩殑璇濋兘闅懼厤綆′腑紿ヨ憊銆傚氨榪濭osling鏈漢鍐欑殑銆奣he Java Programming Language銆嬩腑涔熻鐒変笉璇︺傛墍浠ワ紝鍐欒繖綃囨枃绔犵殑鐩殑渚挎槸瑕佸榪欎釜闂鎻愪緵涓涓暣浣撹鍥撅紝鐩鎬俊鎴戯紝榪欐槸涓湁瓚g殑璇濋:-)
涓轟粈涔堣閿欒澶勭悊錛?br>
榪欐槸鍏充簬閿欒澶勭悊鐨勯棶棰橀噷闈㈡渶綆鍗曠殑涓涓傜瓟妗堜篃寰堢畝鍗曪細鐜板疄涓栫晫鏄笉瀹岀編鐨勶紝鎰忔枡涔嬪鐨勪簨鎯呮椂鏈夊彂鐢熴?br>
涓涓幇瀹為」鐩笉鍍忓湪瀛︽牎閲岄潰瀹屾垚澶т綔涓氾紝鍙鑰冭檻璇ュ畬鎴愮殑鍔熻兘錛岃蛋happy path錛堜篃鍙玂ne True Path錛夊嵆鍙紝蹇界暐浠諱綍鍙兘鍑洪敊鐨勫洜绱狅紙鍛?. 浣犱細璇達紝鎬庝箞浼氬嚭閿欏憿錛熼厤緗枃浠惰偗瀹氬湪閭o紝鐭╅樀鏂囦歡閲岄潰鑲畾鍚殑鏄湁鏁堟暟瀛?. 鍥犱負鎵鏈夌殑鐜鍥犵礌閮藉湪浣犵殑鎺у埗涔嬩笅銆傚氨綆楀嚭鐜頒粈涔堜笉嫻嬶紝姣斿榪愯鍒頒竴鍗婅浜烘嫈浜嗙綉綰匡紝閭e氨璁╃▼搴忓穿婧冨ソ浜嗭紝鍐嶅弻鍑諱竴涓嬩笉灝辮浜嗗槢錛夈?br>
鐒惰岀幇瀹炰笘鐣岀殑杞歡灝卞繀欏昏冭檻閿欒澶勭悊浜嗐傚鏋滀竴涓敊璇槸鑳藉鎭㈠鐨勶紝瑕佸敖閲忔仮澶嶃傚鏋滄槸涓嶈兘鎭㈠鐨勶紝瑕佸Ε鍠勭殑閫鍑烘ā鍧楋紝淇濇姢鐢ㄦ埛鏁版嵁錛屾竻鐞嗚祫婧愩傚鏋滄湁蹇呰鐨勮瘽搴旇璁板綍鏃ュ織錛屾垨閲嶅惎妯″潡絳夌瓑銆?br>
綆鑰岃█涔嬶紝閿欒澶勭悊鐨勬渶涓昏鐩殑鏄負浜嗘瀯閫犲仴澹郴緇熴?br>
浠涔堟椂鍊欏仛閿欒澶勭悊錛燂紙鎴栬咃細浠涔堟槸“閿欒”錛燂級
閿欒錛屽緢綆鍗曪紝灝辨槸涓嶆紜殑浜嬫儏銆備篃灝辨槸涓嶈鍙戠敓鐨勪簨鎯呫傛湁涓涓緢濂界殑鍔炴硶鍙互鎵懼嚭鍝簺鎯呭喌鏄敊璇傞鍏堝氨褰撹嚜宸辨槸鍦ㄤ竴涓畬緹庣幆澧冧笅緙栫▼鐨勶紝涓鍒噋recondition閮芥弧瓚籌細鏂囦歡瀛樺湪閭i噷錛屾枃浠舵病琚牬鍧忥紝緗戠粶姘歌繙瀹屽ソ錛屾暟鎹寘姘歌繙瀹屾暣錛岀▼搴忓憳姘歌繙涓嶄細鎷胯剳琚嬪幓鎵撹媿铦囷紝絳夌瓑… 榪欑鎯呭喌涓嬬紪鍐欑殑紼嬪簭涔熻縐頒負happy path錛堟垨One True Path錛夈?br>
鍓╀笅鐨勬墍鏈夋儏鍐甸兘鍙互鐪嬩綔鏄敊璇傚嵆“涓嶅簲璇?#8221;鍙戠敓鐨勬儏鍐碉紝涓嶅湪綆楄涔嬪唴鐨勬儏鍐碉紝鎴栬呴鏂欎箣澶栫殑鎯呭喌錛寃hatever銆?br>
綆鑰岃█涔嬶紝浠涔堥敊璇憿錛熻皟鐢ㄦ柟榪濆弽琚皟鐢ㄥ嚱鏁扮殑precondition銆佹垨涓涓嚱鏁版棤娉曠淮鎸佸叾鐞嗗簲緇存寔鐨刬nvariants銆佹垨涓涓嚱鏁版棤娉曟弧瓚沖畠鎵璋冪敤鐨勫叾瀹冨嚱鏁扮殑precondition銆佹垨涓涓嚱鏁版棤娉曚繚璇佸叾閫鍑烘椂鐨刾ostcondition錛涗互涓婃墍鏈夋儏鍐甸兘灞炰簬閿欒銆傦紙璇﹁銆奀++ Coding Standards: 101 Rules, Guidelines, and Best Practices銆嬬70绔狅紝鎴栥奜bject Oriented Software Construction, 2nd edition銆嬬11銆?2绔狅級
渚嬪鏂囦歡鎵句笉鍒幫紙閫氬父鎰忓懗鐫涓涓敊璇級銆侀厤緗枃浠惰娉曢敊璇佸皢涓涓艱祴緇欎竴涓誨簲璇ユ槸姝e肩殑鍙橀噺銆佹枃浠跺瓨鍦ㄤ絾鐢變簬璁塊棶闄愬埗鑰屼笉鑳芥墦寮錛屾垨鎵撳紑涓嶈兘鍐欍佺綉緇滀紶杈撻敊璇佺綉緇滀腑鏂佹暟鎹簱榪炴帴閿欒銆佸弬鏁版棤鏁堢瓑銆?br>
涓嶈繃璇濊鍥炴潵錛岀幇瀹炰笘鐣屼腑錛岄敊璇笌闈為敊璇箣闂寸殑鐣屽畾鍏跺疄鏄緢妯$硦鐨勩備緥濡傛枃浠剁己澶憋紝鍙兘澶у鏁版儏鍐典笅閮芥剰鍛崇潃涓涓敊璇紙褰卞搷紼嬪簭姝e父鎵ц騫跺緱鍑烘甯哥粨鏋滐級錛岀劧鑰屾湁鐨勬儏鍐典笅涔熷彲鑳芥牴鏈氨涓嶆槸閿欒錛堟垨鑰呰嚦灝戞槸鍙仮澶嶇殑閿欒錛夛紝姣斿浣犵殑琛楁満妯℃嫙鍣ㄧ殑閰嶇疆鏂囦歡緙哄け浜嗭紝涓鑸▼搴忓彧瑕佸垱寤轟竴涓己鐪佺殑鍗沖彲銆?br>
鍥犳錛屽叧浜庢妸鍝簺鎯呭喌鐣屽畾涓洪敊璇紝鍏蜂綋鐨勭瓟妗堝嚑涔庢繪槸瑙嗗叿浣撴儏鍐佃屽畾鐨勩備絾璇濊櫧濡傛錛屼粛鐒惰繕鏄湁涓浜涗竴鑸х殑鍘熷垯錛屽涓嬶細
鍝簺鎯呭喌涓嶅睘浜庨敊璇紵
1. 鎺у埗紼嬪簭嫻佺殑榪斿洖鍊間笉鏄敊璇細濡傛灉涓涓儏鍐電粡甯稿彂鐢燂紝寰寰鎰忓懗鐫瀹冩槸鐢ㄦ潵鎺у埗紼嬪簭嫻佺▼鐨勶紝搴旇鐢╯tatus-code榪斿洖錛堟敞鎰忥紝涓嶅悓浜巈rror-code錛夛紝姣斿緇忓吀鐨剋hile(cin >> i)銆傝鍏ユ暣鍨嬪け璐ユ槸寰堝父瑙佺殑鎯呭喌錛岃屼笖錛岃繖閲岀殑“璇誨叆鏁村瀷澶辮觸”鍏跺疄鐪熸鐨勫惈涔夋槸“嫻佺殑涓嬩竴涓瓧孌典笉鏄暣鍨?#8221;錛屽悗鑰呭緢鏄庣‘鍦頒笉浠h〃涓涓敊璇紱鍐嶆瘮濡傚湪涓涓瓧絎︿覆涓鎵句竴涓瓙涓詫紝濡傛灉鎵句笉鍒拌瀛愪覆錛屼篃涓嶇畻閿欒銆傝繖綾繪帶鍒剁▼搴忔祦鐨勮繑鍥炲奸兘鏈変竴涓叡鍚岀殑鐗圭偣錛屽嵆鎴戜滑閮戒竴瀹氫細鍒╃敤瀹冧滑鐨勮繑鍥炲兼潵緙栧啓if-else錛屽驚鐜瓑鎺у埗緇撴瀯錛屽錛?br>
if(foo(…)) { … }
else { … }
鎴?br>
while(foo(…)) { … }
榪欓噷鍐嶆憳涓や釜鐩稿簲鐨勫叿浣撲緥瀛愶紝涓涓潵鑷狦osling鐨勩奣he Java Programming Language銆嬶紝鏄叧浜巗tream鐨勩?br>
浣跨敤status-code錛?br>
while ((token = stream.next()) != Stream.END)
process(token);
stream.close();
浣跨敤exception錛?br>
try {
for(;;) {
process(stream.next());
}
} catch (StreamEndException e) {
stream.close();
}
楂樹笅绔嬪垽銆?br>
鍙︿竴涓緥瀛愭潵鑷猅C++PL錛圵ell, not exactly錛夛細
size_t index;
try {
index = find(str, sub_str);
… // case 1
} catch (ElementNotFoundException& e) {
… // case 2
}
浣跨敤status-code錛?br>
int index = find(str, sub_str)
if(index != -1) {
… // case 1
} else {
… // case 2
}
浠ヤ笂榪欑被鎯呭喌鐨勭壒鐐規槸錛岃繑鍥炲兼湰韜篃鏄▼搴忎富閫昏緫錛坔appy path錛夌殑涓閮ㄥ垎錛岃繑鍥炵殑涓ょ鎴栧嚑縐嶅彲鑳芥э紝閮芥槸瀹屽叏姝e父鐨勩侀鏂欎箣涓殑銆?br>
1’. 鍙︿竴鏂歸潰錛岃繕鏈変竴縐嶆儏鍐典笌姝ゆ湁寰鐨勫尯鍒紝鍗?#8220;鍙仮澶嶉敊璇?#8221;銆傚彲鎭㈠閿欒涓庝笂闈㈢殑鎯呭喌鐨勫尯鍒湪浜庡畠铏借涔熸槸棰勬枡涔嬩腑鐨勶紝浣嗗畠涓鏃﹀彂鐢熺▼搴忓線寰灝變細杞叆涓涓敊璇仮澶嶅瓙榪囩▼錛屽悗鑰呬細灝藉彲鑳芥仮澶嶇▼搴忎富騫叉墽琛屾墍闇瑕佺殑鏌愪簺鏉′歡錛屾仮澶嶆垚鍔熺▼搴忓垯鍐嶆杞叆涓誨共鎵ц錛岃屼竴鏃︽仮澶嶅け璐ョ殑璇濆氨鐪熺殑鎴愪簡涓涓揣鐪熶環瀹炵殑璁╀漢鍙兘騫茬灙鐪肩殑閿欒浜嗐傛瘮濡侰++閲岄潰鐨刼perator new濡傛灉澶辮觸鐨勮瘽浼氬皾璇曡皟鐢ㄤ竴涓彲鑷畾涔夌殑閿欒鎭㈠瀛愯繃紼嬶紝褰撶劧錛屽悗鑰呭茍闈炴昏兘鎴愬姛灝嗙▼搴忔仮澶嶈繃鏉ャ傞櫎浜嗚漿鍏ヤ竴涓敊璇仮澶嶅瓙榪囩▼涔嬪錛屽彟涓縐嶅彲鑳芥ф槸紼嬪簭浼歞egenerate鍏ヤ竴鏉econd-class鐨勬敮嫻侊紝鍚庤呬篃璁歌兘瀹屾垚鏌愪簺棰勬湡鐨勫姛鑳斤紝浣嗗嵈鏄?#8220;涓嶅畬緹?#8221;鍦板畬鎴愮殑銆?br>
榪欑被閿欒濡備綍澶勭悊鍚庨潰浼氳璁恒?br>
2. 緙栫▼bug涓嶆槸閿欒銆傚睘浜庡悓涓涓漢緇存姢鐨勪唬鐮侊紝鎴栬呭悓涓涓皬緇勭淮鎶ょ殑浠g爜錛屽鏋滈噷闈㈠嚭鐜癰ug錛屼嬌寰椾竴涓嚱鏁扮殑precondition寰椾笉鍒版弧瓚籌紝閭d箞涓嶅簲璇ヨ涓洪敊璇傝屽簲璇ョ敤assert鏉ュ浠樸傚洜涓虹紪紼媌ug鍙戠敓鏃訛紝浣犱笉浼氬笇鏈涙爤鍥炴粴錛岃屾槸甯屾湜紼嬪簭鍦╝ssert澶辮觸鐐逛笂鐩存帴涓柇錛岃皟鐢ㄨ皟璇曠▼搴忥紝鏌ョ湅涓柇鐐圭殑紼嬪簭鐘舵侊紝浠庤岃В鍐充唬鐮佷腑鐨刡ug銆?br>
鍏充簬榪欎竴鐐癸紝闇瑕佸挨鍏舵敞鎰忕殑鏄紝瀹冪殑鍓嶆彁鏄細蹇呴』瑕佹槸鍚屼竴涓漢鎴栧皬緇勭淮鎶ょ殑浠g爜銆傚悓涓涓皬緇勫唴鍙互淇濊瘉鏌ョ湅鍒版簮浠g爜錛岃繘琛宒ebug銆傚鏋滆皟鐢ㄦ柟鍜岃璋冪敤鏂逛笉灞炰簬鍚屼竴璐熻矗浜猴紝鍒欎笉鑳芥弧瓚硃recondition鐨勮瘽灝卞簲璇ユ姏鍑哄紓甯搞傛諱箣璁頒綇涓涓簿紲烇細assert鏄敤鏉ヨ緟鍔ヾebug鐨勶紙assert鐨勫彟涓涓綔鐢ㄦ槸鏂囨。錛屾弿榪扮▼搴忓湪鐗瑰畾鐐逛笂鐨勭姸鎬侊紝鍗充究assert琚叧闂紝榪欎釜鎻忚堪鍔熻兘涔熶緷鐒跺緢閲嶈錛夈?br>
娉ㄦ剰錛屾湁鏃跺欙紝涓轟簡鏁堢巼鍘熷洜錛屼篃浼氬湪絎笁鏂瑰簱閲岄潰浣跨敤assert鑰屼笉鐢ㄥ紓甯告潵鎶ュ憡榪濆弽precondition銆傛瘮濡俿trcpy錛宻td::vector鐨刼perator[]銆?br>
3. 棰戠箒鍑虹幇鐨勪笉鏄敊璇傞綣佸嚭鐜扮殑鎯呭喌鏈変袱縐嶅彲鑳斤紝涓鏄綘鐨勭▼搴忛棶棰樺ぇ浜嗭紙涓嶇劧鎬庝箞鎬繪槸鍑洪敊鍛紵錛夈備簩鏄嚭鐜扮殑鏍規湰涓嶆槸閿欒錛岃屾槸灞炰簬紼嬪簭鐨勬甯告祦紼嬨傚悗鑰呭簲璇ユ敼鐢╯tatus-code銆?br>
鎻掓洸錛氬紓甯革紙exception錛塿s閿欒浠g爜錛坋rror-code錛?br>
寮傚父鐩歌緝浜庨敊璇唬鐮佺殑浼樺娍澶浜嗭紝浠ヤ笅鏄竴涓紙涓嶅畬鍏級鍒楄〃銆?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬩竴鈥斺斿紓甯鎬細鑷姩寰涓婂眰鏍堜紶鎾細涓鏃﹀紓甯歌鎶涘嚭錛屾墽琛屾祦灝辯珛鍗充腑姝紝鍙栬屼唬涔嬬殑鏄嚜鍔ㄧ殑stack-unwinding鎿嶄綔錛岀洿鍒版壘鍒頒竴涓傚綋鐨刢atch瀛愬彞銆?br>
鐩歌緝涔嬩笅錛屼嬌鐢╡rror-code鐨勮瘽錛岃灝嗕笅灞傝皟鐢ㄥ彂鐢熺殑閿欒浼犳挱鍒頒笂灞傚幓錛屽氨蹇呴』鎵嬪姩媯鏌ユ瘡涓皟鐢ㄨ竟鐣岋紝浠諱綍閿欒錛岄兘蹇呴』鎵嬪姩杞彂錛堣繑鍥烇級緇欎笂灞傦紝紼嶆湁閬楁紡錛屽氨浼氬甫鐫閿欒鐨勭姸鎬佺戶緇線涓嬫墽琛岋紝浠庤屽湪涓嬫父涓嶇煡閬撶浜嗗榪滅殑鍦版柟鏈緇堝紩鐖嗙▼搴忋傝繖鏉ヤ簡浠ヤ笅鍑犱釜闂錛?br>
1. 楹葷儲銆傛瘡涓涓彲鑳借繑鍥為敊璇唬鐮佺殑璋冪敤杈圭晫閮介渶瑕佹鏌ワ紝涓嶇浣犲疄闄呬笂瀵逛笉瀵硅繑鍥炵殑閿欒浣滃搷搴旓紝鍥犱負鍗充究浣犺嚜宸變笉瑙e喅榪斿洖鐨勯敊璇紝涔熻鎶婂畠浼犳挱鍒頒笂灞傚幓濂借涓婂眰瑙e喅銆?br>
2. 涓嶄紭闆呬笖涓嶅彲浼哥緝(scalability)鐨勪唬鐮侊紙閿欒澶勭悊浠g爜璺烵ne True Path錛堜篃鍙玥appy path錛夋悈鍜屽湪涓璧鳳級銆傚叧浜庤繖涓鏉℃櫘閬嶇殑璁鴻堪閮戒笉澶熸槑紜紝姣斿鏈変漢鍙兘浼氬弽椹寵錛岄偅閿欒鍙嶆鏄媯鏌ョ殑錛岀敤寮傚父闅鵑亾灝變笉闇瑕佹崟鑾峰紓甯鎬簡鍚楋紵褰撶劧鏄渶瑕佺殑錛屼絾鍏抽敭鏄紝鏈夋椂鍊欐垜浠笉涓瀹氫細鍦ㄥ紓甯稿彂鐢熺殑绔嬪嵆鐐逛笂鎹曡幏騫跺鐞嗗紓甯搞傝繖鏃跺欙紝寮傚父鐨勪紭鍔垮氨鏄劇幇鍑烘潵浜嗭紝姣斿錛?br>
void foo()
{
try {
op1;
op2;
…
opN;
} catch (…) {
… // log
… // clean up
throw;
}
}
濡傛灉鐢╡rror-code鐨勮瘽錛?br>
int foo()
{
if(!op1()) {
… // log? clean up?
return FAILED;
}
if(!op2()) {
… // log? clean up?
return FAILED;
}
…
return SUCCEEDED;
}
濂戒竴鐐圭殑鏄繖鏍鳳細
int foo()
{
if(!op1()) goto FAILED;
if(!op2()) goto FAILED;
…
if(!opN()) goto FAILED;
return SUCCEEDED;
FAILED:
… // log, clean up
return FAILED;
}
灝辯畻鏄渶鍚庝竴縐嶅仛娉曪紙鎵璋撶殑“On Error Goto”錛夛紝One True Path涓粛鐒跺す鏉傜潃澶ч噺鐨勫櫔闊籌紙濡傛灉榪斿洖鐨勯敊璇間笉鍙槸FAILED/SUCCEEDED涓ょ鐨勮瘽鍣煶浼氭洿澶э級銆傛澶栨墜鍔ㄦ鏌ヨ繑鍥炲肩殑鎴愬姛澶辮觸姣曠珶鏄緢error-prone鐨勫仛娉曘?br>
鍊煎緱娉ㄦ剰鐨勬槸錛岃繖閲屾垜騫舵病鏈夌敤涓涓父琚紩鐢ㄧ殑渚嬪瓙錛屽嵆錛氬鏋滀綘鏄敤C鍐欎唬鐮侊紙C涓嶆敮鎸佸眬閮ㄥ彉閲忚嚜鍔ㄦ瀽鏋勶紙RAII錛夛級錛岄偅涔堢▼搴忓線寰浼氳鍐欐垚榪欐牱錛?br>
int f()
{
int returnCode = FAILED;
acquire resource1;
if(resource1 is acquired) {
acquire resource2;
if(resource2 is acquired) {
acquire resource3;
if(resource3 is acquired) {
if(doSomething1()) {
if(doSomething2()) {
if(doSomething3()) {
returnCode = SUCCEEDED;
}
}
}
release resource3;
}
release resource2;
}
release resource1;
}
return returnCode;
}
鎴栬呭儚榪欐牱錛?br>
int f()
{
int returnCode = FAILED;
acquire resource1;
if(resources1 is not acquired)
return FAILED;
acquire resource2;
if(resource2 is not acquired) {
release resource1;
return FAILED;
}
acquire resource3;
if(resource3 is not acquired) {
release resource2;
release resource1;
return FAILED;
}
... // do something
release resource3;
release resource2;
release resource1;
return SUCCEEDED;
}
錛堜竴涓洿澶嶆潅鐨勫叿浣撲緥瀛愬彲浠ュ弬鑰僛16]錛?br>
浠ヤ笂涓ょ鏂規鍦ㄥ彲浼哥緝鎬ф柟闈㈢殑闂鏄樉鑰屾槗瑙佺殑錛氫竴鏃﹂渶瑕佽幏鍙栫殑璧勬簮澶氫簡浠ュ悗浠g爜涔熶細闅忕潃瓚婃潵瓚婇毦浠ュ崚璇伙紝瑕佷箞鏄痠f宓屽灞傛闅忎箣綰挎у澶氾紝瑕佷箞鏄噸澶嶄唬鐮佸澶氥傛墍浠ュ嵆渚塊」鐩腑鍥犱負鏌愪簺鐜板疄鍘熷洜鍙兘浣跨敤error-code錛屼篃鏈濂介噰鐢ㄥ墠闈㈡彁鍒扮殑“On Error Goto”鏂規銆?br>
鍙︿竴鏂歸潰錛屽綋鏁翠釜鍑芥暟闇瑕佷繚鎸佸紓甯鎬腑绔嬬殑鏃跺欙紝寮傚父鐨勪紭鍔垮氨鏇存樉鐜板嚭鏉ヤ簡錛氫嬌鐢╡rror-code錛屼綘榪樻槸闇瑕佷竴嬈℃鐨勫皬蹇僣heck姣忎釜榪斿洖鐨勯敊璇鹼紝浠庤岄樆姝㈡墽琛屾祦甯︾潃閿欒寰涓嬬戶緇墽琛屻傜敤寮傚父鐨勮瘽錛屽彲浠ョ洿鎺ヤ功鍐橭ne True Path錛岃繛try-catch閮戒笉瑕併?br>
褰撶劧錛屽嵆渚挎槸浣跨敤寮傚父浣滀負閿欒姹囨姤鏈哄埗錛岄敊璇畨鍏紙error-safety錛夎繕鏄渶瑕佷繚璇佺殑銆傚煎緱娉ㄦ剰鐨勬槸錛岄敊璇畨鍏ㄦу睘浜庨敊璇鐞嗙殑鏈川鍥伴毦錛岃窡浣跨敤寮傚父榪樻槸error-code鏉ユ眹鎶ラ敊璇病鏈夊叧緋伙紝涓涓父瑙佺殑璋灝辨槸璁稿浜烘妸鍦ㄥ紓甯鎬嬌鐢ㄨ繃紼嬩腑閬囧埌鐨勯敊璇畨鍏ㄦф柟闈㈢殑鍥伴毦褰掑拵鍒板紓甯歌韓涓娿?br>
3. 鑴嗗急錛堟槗閿欙級銆傚彧瑕佸繕浜嗘鏌ヤ換鎰忎竴涓敊璇唬鐮侊紝鎵ц嫻佸氨蹇呯劧浼氬甫鐫閿欒鐘舵佸線涓嬬戶緇墽琛岋紝鍚庤呭嚑涔庤偗瀹氫笉鏄綘鎯寵鐨勩傚甫鐫閿欒鐘舵佸線涓嬫墽琛屽ソ涓鐐圭殑浼氱珛鍗沖穿婧冿紝宸竴鐐圭殑鍒欏湪鐩稿樊鍗佷竾鍏崈閲岀殑鍦版柟寮曞彂涓涓帿鍚嶅叾濡欑殑閿欒銆?br>
4. 闅句互錛堢紪鍐欐椂錛夌‘淇濆拰錛坮eview鏃訛級媯鏌ヤ唬鐮佺殑姝g‘鎬с傞渶瑕佹鏌ユ墍鏈夊彲鑳界殑閿欒浠g爜鏈夋病鏈夐兘琚Ε鍠刢heck浜嗭紝鍏朵腑涔熻澶ч儴鍒嗛兘鏄笉鑳界洿鎺ュ浠樿岄渶瑕佷紶鎾粰涓婄駭鐨勯敊璇?br>
5. 鑰﹀悎銆傚嵆渚夸綘鐨勫嚱鏁版槸涓涓紓甯鎬腑绔嬬殑鍑芥暟錛屼笉綆″簳灞備紶涓婃潵鍝簺閿欒涓寰嬫姏緇欎笂灞傦紝浣犱粛鐒墮渶瑕佸湪姣忎釜璋冪敤鐨勮竟鐣屾鏌ワ紝騫跺Ε鍠勫線涓婃墜鍔ㄤ紶鎾瘡涓涓敊璇唬鐮併傝屼竴鏃﹀簳灞傛帴鍙e鍔犮佸噺灝戞垨鏀瑰姩閿欒浠g爜鐨勮瘽錛屼綘鐨勫嚱鏁板氨闇瑕佺珛鍗充綔鍑虹浉搴旀敼鍔紝媯鏌ュ茍浼犳挱搴曞眰鎺ュ彛鏀瑰姩鍚庣浉搴旂殑閿欒浠g爜鈥斺旇繖鏄緢涓嶅垢鐨勶紝鍥犱負浣犵殑鍑芥暟鍙槸鎯充繚鎸佸紓甯鎬腑绔嬶紝涓嶇搴曞眰鍑轟粈涔堥敊涓寰嬫姏緇欎笂灞傝皟鐢ㄦ柟錛岃繖縐嶆儏鍐典笅鐞嗘兂鎯呭喌搴旇鏄笉綆″簳灞傜殑閿欒璇剰濡備綍淇敼錛屽綋鍓嶅眰閮藉簲璇ヤ笉闇瑕佹敼鍔ㄦ墠瀵廣?br>
6. 娌℃湁寮傚父錛屾牴鏈棤娉曠紪鍐欐硾鍨嬬粍浠躲傛硾鍨嬬粍浠舵牴鏈笉鐭ラ亾搴曞眰浼氬嚭鍝簺閿欙紝娉涘瀷緇勪歡鐨勭壒鐐逛箣涓渚挎槸閿欒涓珛銆備絾鐢╡rror-code鐨勮瘽錛屾庝箞鍋氬埌閿欒涓珛錛熸硾鍨嬬粍浠惰濡備綍媯鏌ワ紝媯鏌ュ摢浜涘簳灞傞敊璇紵鍞竴鐨勫姙娉曞氨鏄鎵鏈夌殑搴曞眰閿欒閮界敤緇熶竴鐨凷UCCEEDED鍜孎AILED浠g爜鏉ヨ〃杈撅紝騫朵笖灝嗗叾瀹冮敊璇俊鎭敤GetLastError鏉ヨ幏鍙栥傚涓斾笉璇磋繖涓柟妗堢殑涓戦檵錛屽浣曘佺敱璋佹潵緇熶竴鍒跺畾SUCCEEDED鍜孎AILED銆丟etLastError鐨勬爣鍑嗭紵灝辯畻鏈夎繖涓粺涓鏍囧噯錛屼綘涔熷彲浠ヨ鎯充竴涓嬫煇涓爣鍑嗗簱娉涘瀷綆楁硶錛堝for_each錛夌紪鍐欒搗鏉ヨ鏄浣曚笐闄嬨?br>
7. 閿欒浠g爜涓嶅彲浠ヨ蹇樻帀錛堝拷瑙嗭級銆傚繕鎺夌殑鍚庢灉瑙佺3鏉°傛澶栵紝鏈夋椂鍊欐垜浠彲鑳戒細鏁呮剰涓嶇鏌愪簺閿欒錛屽茍鐢ㄤ竴涓竾鑳絚atch鏉ユ崟鑾鋒墍鏈夋湭琚崟鑾風殑閿欒錛宭og錛屽悜鏀寔緗戠珯鍙戦侀敊璇姤鍛婏紝騫墮噸鍚▼搴忋傜敤寮傚父榪欏氨寰堝鏄撳仛鍒扳斺斿彧瑕佸啓涓涓猽nhandled exception handler錛堜笉鍚岃璦瀵規鐨勬敮鎸佹満鍒朵笉涓鏍鳳級鍗沖彲銆?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬩簩鈥斺斿紓甯哥殑浼犳挱浣跨敤鐨勬槸涓涓崟鐙殑淇¢亾錛岃岄敊璇唬鐮佸垯鍗犵敤浜嗗嚱鏁扮殑榪斿洖鍊鹼紱鍑芥暟鐨勮繑鍥炲兼湰鏉ョ殑璇剰鏄敤鏉ヨ繑鍥?#8220;鏈夌敤鐨?#8221;緇撴灉鐨勶紝榪欎釜緇撴灉鏄睘浜庣▼搴忕殑One True Path鐨勶紝鑰屼笉鏄敤鏉ヨ繑鍥為敊璇殑銆?br>
鍒╃敤榪斿洖鍊兼潵浼犳挱閿欒瀵艱嚧鐨勯棶棰樺涓嬶細
8. 鎵鏈夊嚱鏁伴兘蹇呴』灝嗚繑鍥炲奸鐣欑粰閿欒銆傚鏋滀綘鐨勫嚱鏁版渶鑷劧鐨勮鎰忔槸榪斿洖涓涓猟ouble錛岃屾瘡涓猟ouble閮芥槸鏈夋晥鐨勩備笉琛岋紝浣犲緱鎶婅繖涓繑鍥炲奸氶亾棰勭暀鐫緇欓敊璇鐞嗙敤銆備綘鍙兘浼氳錛屾垜鐨勫嚱鏁板緢綆鍗曪紝涓嶄細鍑洪敊銆備絾濡傛灉浠ュ悗浣犱慨鏀逛簡涔嬪悗錛屽嚱鏁板鏉備簡鍛紵鍒伴偅涓椂鍊欏啀鎶婅繑鍥炵殑double鏀逛負int騫跺姞涓婁竴涓猟ouble&浣滀負out鍙傛暟鐨勮瘽錛屾敼鍔ㄥ彲灝卞ぇ浜嗐?br>
9. 榪斿洖鍊兼墍鑳芥壙杞界殑閿欒淇℃伅鏄湁闄愮殑銆侼ULL錛?1錛熶粈涔堟剰鎬濓紵鍏蜂綋鐨勯敊璇俊鎭彧鑳界敤GetLastError鏉ユ彁渚?#8230; 鍝︼紝瀵逛簡錛屼綘鐪嬭鏈夊灝戜漢鐢ㄨ繃GetLastError鐨勶紵
10. 涓嶄紭闆呯殑浠g爜銆傚憙…榪欎釜闂鍓嶉潰涓嶆槸璇磋繃浜嗕箞錛熶笉錛岃繖閲岃鐨勬槸鍙︿竴涓笉浼橀泤涔嬪鈥斺斿崰鐢ㄤ簡鐢ㄦ潵榪斿洖緇撴灉鐨勮繑鍥炲奸氶亾銆傛湰鏉ュ緢鑷劧鐨?#8220;璁$畻鈥斺旇繑鍥炵粨鏋?#8221;錛屽彉鎴愪簡“璁$畻鈥斺斾慨鏀筼ut鍙傛暟鈥斺旇繑鍥為敊璇?#8221;銆傚綋鐒訛紝浣犲彲浠ヨ榪欎釜闂涓嶆槸寰堜弗閲嶃傜殑紜紝灝哾ouble res = readInput();鏀逛負double res; readInput(&res);涔熸病浠涔堝ぇ涓嶄簡鐨勩傚鏋滄槸榪炶皟鐢ㄥ憿錛熸瘮濡傦紝process(readInput());鍛?#8230; 鎴栬卹eadInput() + …錛熸垨鑰呬竴鑸湴錛宱p1(op2(), op3(), …);錛?br>
11. 閿欒姹囨姤鏂規涓嶄竴鑷存с傜湅鐪媁in32涓嬮潰鐨勯敊璇眹鎶ユ満鍒跺惂錛欻RESULT銆丅OOL銆丟etLastError…鏈川涓婂氨鏄洜涓哄埄鐢ㄨ繑鍥炲奸氶亾鏄竴涓ˉ涓佹柟妗堬紝閿欒澶勭悊鏄▼搴忕殑涓涓柟闈紙aspect錛夛紝鐞嗗簲鏈夊叾鍗曠嫭鐨勬眹鎶ラ氶亾銆傚埄鐢ㄥ紓甯哥殑璇濓紝閿欒姹囨姤鏂規灝辯珛鍗崇粺涓浜嗭紝鍥犱負榪欐槸涓涓猣irst-class鐨勮璦綰ф敮鎸佹満鍒躲?br>
12. 鏈変簺鍑芥暟鏍規湰鏃犳硶榪斿洖鍊鹼紝濡傛瀯閫犲嚱鏁般傛湁浜涘嚱鏁拌繑鍥炲兼槸璇█闄愬埗濂戒簡鐨勶紝濡傞噸杞界殑鎿嶄綔絎﹀拰闅愬紡杞崲鍑芥暟銆?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬩笁鈥斺斿紓甯告湰韜兘澶熸惡甯︿換鎰忎赴瀵岀殑淇℃伅銆?br>
13. 鏈変粈涔堥敊璇姤鍛婃満鍒惰兘姣旈敊璇姤鍛婃湰韜氨鍖呭惈灝介噺涓板瘜鐨勪俊鎭洿濂界殑鍛紵浣跨敤寮傚父鐨勮瘽錛屼綘鍙互寰寮傚父綾婚噷闈㈡坊鍔犳暟鎹垚鍛橈紝娣誨姞鎴愬憳鍑芥暟錛屾惡甯︿換鎰忕殑淇℃伅錛堟瘮濡侸ava鐨勫紓甯哥被灝辯己鐪佹惡甯︿簡闈炲父鏈夌敤鐨勮皟鐢ㄦ爤淇℃伅錛夈傝岄敊璇唬鐮佸氨鍙湁涓涓崟钖勭殑鏁板瓧鎴栧瓧絎︿覆錛岃鎼哄甫鍏跺畠淇℃伅鍙兘鍙﹀瀛樺湪鍏跺畠鍦版柟錛屽茍鏈熸湜浣犺兘閫氳繃GetLastError鍘繪煡鐪嬨?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬪洓鈥斺斿紓甯告槸OO鐨勩?br>
14. 浣犲彲浠ヨ璁¤嚜宸辯殑寮傚父緇ф壙浣撶郴銆傚憙…閭h繖鍙堟湁浠涔堢敤鍛紵褰撶劧鏈夌敤錛屼竴涓渶澶х殑濂藉灝辨槸浣犲彲浠ュ湪浠繪剰鎶借薄灞傛涓奵atch涓緇勫紓甯革紙exception grouping錛夛紝姣斿浣犲彲浠ョ敤catch(IOException)鏉ユ崟鑾鋒墍鏈夌殑IO寮傚父錛岀敤catch(SQLException)鏉ユ崟鑾鋒墍鏈夌殑SQL寮傚父銆傜敤catch(FileException)鏉atch鎵鏈夌殑鏂囦歡寮傚父銆備綘涔熷彲浠atch鏇存槑紜竴鐐圭殑寮傚父錛屽StreamEndException銆傛諱箣錛宑atch鐨勭矑搴︽槸綺楁槸緇嗭紝鏍規嵁闇瑕侊紝闅忎綘璋冭妭銆傚綋鐒朵簡錛屼綘鍙互璁捐鑷繁鐨勬柊寮傚父銆傝兘澶焎atch涓緇勭浉鍏沖紓甯哥殑濂藉灝辨槸浣犲彲浠ュ緢鏂逛究鐨勫浠栦滑鍋氱粺涓鐨勫鐞嗐?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬩簲鈥斺斿紓甯告槸寮虹被鍨嬬殑銆?br>
15. 寮傚父鏄己綾誨瀷鐨勩傚湪catch寮傚父鐨勬椂鍊欙紝涓涓壒瀹氱被鍨嬬殑catch鍙兘catch綾誨瀷鍖歸厤鐨勫紓甯搞傝岀敤error-code鐨勮瘽錛屽氨璺焑num涓鏍鳳紝綾誨瀷涓嶅畨鍏ㄣ?1 == foo()錛烣AILED == foo()錛烳B_OK == foo()錛熷ぇ瀹跺弽姝i兘鏄暣鏁般?br>
寮傚父涓庨敊璇唬鐮佺殑鏈川鍖哄埆涔嬪叚鈥斺斿紓甯告槸first-class鐨勮璦鏈哄埗銆?br>
16. 浠g爜鍒嗘瀽宸ュ叿鍙互璇嗗埆鍑哄紓甯稿茍榪涜鍚勭鐩戞祴鎴栧垎鏋愩傛瘮濡侾erfMon灝變細瀵圭▼搴忎腑鐨勫紓甯稿仛緇熻銆傝繖涓ソ澶勬斁鍦ㄦ湭鏉ユ椂鎬佷笅鎴栬鎬庝箞閮戒笉搴旇灝忚銆?br>
閫夋嫨浠涔堥敊璇鐞嗘満鍒訛紵
鐪嬪畬涓婇潰鐨勬瘮杈冿紝絳旀鐩鎬俊搴旇宸茬粡寰堟槑鏄句簡錛氬紓甯搞?br>
濡傛灉浣犱粛鐒舵槸error-code鐨勬濈淮涔犳儻鐨勮瘽錛屽彲浠ュ亣鎯沖皢鎵鏈塭rror-code鐨勫湴鏂規敼涓烘姏鍑篹xception銆傞渶瑕佹敞鎰忕殑鏄紝error-code涓嶆槸status-code銆傚茍闈炴墍鏈夎繑鍥炲奸兘鏄敤鏉ユ姤鍛婄湡姝g殑閿欒鐨勶紝鏈変簺鍙笉榪囨槸鎺у埗紼嬪簭嫻佺殑銆傚氨綆楄繑鍥炵殑鏄痓ool鍊鹼紙姣斿鏌ユ壘瀛愪覆錛岃繑鍥炴槸鍚︽煡鎵懼埌錛夛紝涔熷茍涓嶄唬琛╢alse鐨勬儏鍐靛氨鏄竴涓敊璇傚叿浣撳弬鍔犱笂涓鑺傦細“鍝簺鎯呭喌涓嶅睘浜庨敊璇?#8221;銆?br>
涓涓渶涓哄箍娉涚殑璇В灝辨槸錛氬紓甯稿紩鍏ヤ簡涓嶈彶鐨勫紑閿錛岃宔rror-code娌℃湁寮閿錛屾墍浠ュ簲璇ヤ嬌鐢╡rror-code銆傝繖涓鐐圭殑婕忔礊鍦ㄤ簬錛屽畠璁や負鍙鏄紑閿灝辨槸鏈夐棶棰樼殑錛岃屼笉鍏沖績鍒板簳鏄湪浠涔堟儏鍐典笅鐨勫紑閿銆傚疄闄呬笂錛岀幇浠g殑緙栬瘧鍣ㄦ棭宸茶兘澶熷仛鍒板紓甯稿湪happy path涓婄殑闆跺紑閿銆傚綋鐒訛紝絀洪棿寮閿榪樻槸鏈夌殑錛屽洜涓洪浂寮閿鏂規鐢ㄧ殑鏄湴鍧琛ㄦ柟妗堬紱浣嗙浉杈冧簬鏃墮棿寮閿錛岃繖閲岀殑絀洪棿寮閿鍑犱箮浠庢潵閮戒笉鏄釜闂銆傚彟涓鏂歸潰錛屼竴鏃﹀彂鐢熶簡寮傚父錛岀▼搴忚偗瀹氬氨鍑轟簡闂錛岃繖涓椂鍊欑殑鏃墮棿寮閿寰寰灝變笉閭d箞閲嶈浜嗐傛澶栨湁浜轟細璇達紝閭e鏋滈綣佹姏鍑哄紓甯稿憿錛熷鏋滈綣佹姏鍑哄紓甯革紝寰寰灝辨剰鍛崇潃閭d釜寮傚父瀵瑰簲鐨勫茍闈炰竴涓敊璇儏鍐點?br>
銆奀++ Coding Standards: 101 Rules, Guidelines, and Best Practices銆嬮噷闈竴鍐嶅己璋冿細涓嶈鍦ㄩ」鐩噷闈㈠叧闂紓甯告敮鎸併傚洜涓哄氨綆椾綘鐨勯」鐩噷闈笉鎶涘嚭寮傚父錛屾爣鍑嗗簱涔熶緷璧栦簬寮傚父銆備竴鏃﹀叧闂紓甯革紝涓嶄粎浣犵殑欏圭洰浠g爜閮借渚濊禆浜巈rror-code錛坋rror-code鐨勭己鐐硅涓嬩竴鑺傦級錛屾暣涓爣鍑嗗簱渚夸篃閮借渚濊禆浜庨潪鏍囧噯鐨勯斿緞鏉ユ眹鎶ラ敊璇紝鎴栬呭共鑴嗗氨涓嶆眹鎶ラ敊璇傚鏋滀綘鐨勯」鐩槸濡傛鐨勭‖瀹炴椂錛屼箖鑷充簬浣犲湪闈炲父灝忓績涓旀繁鍏ョ殑鍒嗘瀽涔嬪悗鍙戣鏌愪簺鎿嶄綔鐪熺殑璐熸媴涓嶈搗寮傚父浜涘井鐨勭┖闂村紑閿鍜寀nhappy path涓婄殑鏃墮棿寮閿鐨勮瘽錛屼篃瑕佸敖閲忓埆鍦ㄥ叏灞鍏抽棴寮傚父鏀寔錛岃屾槸灝介噺灝嗚繖浜涙晱鎰熺殑鎿嶄綔闆嗕腑鍒頒竴涓ā鍧椾腑錛屾寜妯″潡鍏抽棴寮傚父銆?br>
鎻掓洸錛氬紓甯哥殑渚嬪鎯呭喌
鍑′簨閮芥湁渚嬪銆傘奀++ Coding Standards: 101 Rules, Guidelines, and Best Practices銆嬩笂闈㈤檲榪頒簡涓や釜渚嬪鎯呭喌錛氫竴錛岀敤寮傚父娌℃湁甯︽潵鏄庢樉鐨勫ソ澶勭殑鏃跺欙細姣斿鎵鏈夌殑閿欒閮戒細鍦ㄧ珛鍗寵皟鐢ㄧ瑙e喅鎺夋垨鑰呭湪闈炲父鎺ヨ繎绔嬪嵆璋冪敤绔殑鍦版柟瑙e喅鎺夈備簩錛屽湪瀹為檯浣滀簡嫻嬪畾涔嬪悗鍙戠幇寮傚父鐨勬姏鍑哄拰鎹曡幏瀵艱嚧浜嗘樉钁楃殑鏃墮棿寮閿錛氳繖閫氬父鍙湁涓ょ鎯呭喌錛岃涔堟槸鍦ㄥ唴灞傚驚鐜噷闈紝瑕佷箞鏄洜涓鴻鎶涘嚭鐨勫紓甯告牴鏈笉瀵瑰簲浜庝竴涓敊璇?br>
濡備綍榪涜閿欒澶勭悊錛?br>
榪欎釜闂鍚屾牱鏋佸叾閲嶈銆傚畠鍒嗕負涓変釜瀛愰棶棰橈細
1. 浣曟椂鎶涘嚭寮傚父銆?br>
2. 浣曟椂鎹曡幏寮傚父銆?br>
3. 濡備綍閬垮紑寮傚父錛屼繚鎸佸紓甯鎬腑绔嬶紙鎴?#8220;寮傚父閫忔槑”錛夈?br>
鍏朵腑鏈鍚庝竴涓棶棰樻渶涓洪噸瑕侊紝灞炰簬閿欒澶勭悊鐨勬湰璐ㄦу洶闅句箣涓銆?br>
鍏堣鍓嶄袱涓棶棰樸?br>
浠庢湰璐ㄤ笂錛岄敊璇垎涓轟袱縐嶏紝涓縐嶆槸鍙仮澶嶇殑錛屽彟涓縐嶆槸涓嶅彲鎭㈠鐨勩?br>
瀵逛簬鍙仮澶嶇殑閿欒銆傛湁涓ょ鏂規錛?br>
1. 鍦ㄩ敊璇殑鍙戠敓鐐逛笂绔嬪嵆灝變簣浠ユ仮澶嶃傛瘮濡傞厤緗枃浠朵笉瀛樺湪渚垮垱寤轟竴涓己鐪佺殑錛屾煇涓厤緗」緙哄け灝變嬌鐢ㄧ己鐪佸肩瓑絳夈傝繖涓鏂規鐨勫ソ澶勬槸褰撳墠鍑芥暟涓嶈繑鍥炰換浣曢敊璇紝鍥犱負閿欒琚綋鍗蟲悶瀹氫簡錛屽氨鍍忔病鍙戠敓涓鏍楓傝繖縐嶆柟妗堢殑鍓嶆彁鏄綋鍓嶅嚱鏁板繀欏昏鏈夊浠樿閿欒鐨勮凍澶熶笂涓嬫枃錛屽鏋滀竴涓簳灞傜殑鍑芥暟瀵瑰叏灞璇剰娌℃湁瓚沖鐨勮鍥撅紝榪欐椂灝卞彲浠ユ姏鍑哄紓甯革紝鐢變笂灞傚嚱鏁拌礋璐f仮澶嶃?br>
2. 鍦ㄦ煇涓笂灞傛爤涓婃仮澶嶃傝繖縐嶆儏鍐典笅錛屽湪璐熻矗鎭㈠鐨勯偅灞傛爤浠ヤ笅鐨勮皟鐢ㄤ竴鑸鐪嬫垚涓涓暣浣撲簨鍔★紝鍏朵腑鍙戠敓鐨勪換浣曢敊璇兘瀵艱嚧鏁翠釜浜嬪姟鍥炴粴錛屽洖婊氬埌閿欒鎭㈠鏍堝眰闈㈡椂錛岀敱鐩稿簲鐨刢atch瀛愬彞榪涜鎭㈠錛屽茍閲嶆柊鎵ц鏁翠釜浜嬪姟錛屾垨鑰呭皢紼嬪簭寮曞悜鍙︿竴鏉″閫夎礬寰勶紙alternative錛夈?br>
瀵逛簬涓嶅彲鎭㈠鐨勯敊璇備篃鏈変袱縐嶆柟妗堬細
1. Sudden Death銆傚湪閿欒鐨勫彂鐢熺偣涓婇鍑烘ā鍧楋紙鍙兘浼撮殢鐫閲嶅惎妯″潡錛夈傞鍑烘ā鍧楀墠寰寰闇瑕佸厛閲婃斁璧勬簮銆佷繚瀛樺叧閿暟鎹佽褰曟棩蹇楋紝絳夌瓑銆傝鏂規鐨勫墠鎻愭槸鍦ㄩ敊璇殑鍙戠敓鐐圭殑涓婁笅鏂囦腑蹇呴』瑕佽兘澶熼噴鏀炬墍鏈夎祫婧愶紝瑕佽兘澶熶繚瀛樺叧閿暟鎹傝婊¤凍榪欎釜鍓嶆彁錛屽彲浠ョ敤涓涓叏灞鐨勬矙鐩掓潵淇濆瓨鏁翠釜妯″潡鍒板綋鍓嶄負姝㈢敵璇風殑鎵鏈夎祫婧愶紝浠庤屽湪浠諱綍鍑洪敊鐐逛笂閮藉彲浠ュ皢榪欎釜娌欑洅鏁翠釜閲婃斁鎺夈備篃鍙互鐢ㄦ櫤鑳藉瀮鍦炬敹闆嗭紝榪欐牱鍦ㄥ嚭閿欑偣涓婂彧瑕佽褰曟棩蹇楀拰淇濆瓨鏁版嵁錛屾妸鎵熬宸ヤ綔鐣欑粰鏅鴻兘鍨冨溇鏀墮泦鍣ㄥ畬鎴愩傝繖涓柟妗堢殑寮辯偣鏄鏋滈噴鏀捐祫婧愭槸瑕佹寜鏌愮嬈″簭鐨勫氨姣旇緝楹葷儲銆?br>
2. 鍥炴粴銆傚鏋滀綘騫舵病鏈夌敤鏅鴻兘鍨冨溇鏀墮泦錛堣鏅鴻兘鍒拌兘澶熷洖鏀舵枃浠跺彞鏌勶紝緗戠粶绔彛絳夛紝涓嶅厜鏄唴瀛橈級錛屾垨鑰呬綘騫舵病鏈夊湪鏌愪釜鍏ㄥ眬鍙闂殑浣嶇疆淇濆瓨鍒板綋鍓嶄負姝㈡ā鍧楃敵璇風殑鎵鏈夎祫婧愶紝鎴栬呬綘鐨勮祫婧愪簰鐩鎬箣闂存湁渚濊禆鍏崇郴錛屽繀欏繪寜鐓у垎閰嶇殑閫嗗簭閲婃斁錛岀瓑絳夛紝閭d箞灝卞繀欏繪寜鐓ц皟鐢ㄦ爤鐨勫弽鏂瑰悜鍥炴粴浜嬪姟銆傚洖婊氬埌涓涓墍璋撶殑Fault Barrier錛岀敤涓涓猚atch-all鍦ㄩ偅閲岀瓑鐫錛屾墍璋揊ault-Barrier鐨勪綔鐢ㄥ氨鏄負浜嗘姄榪欎簺娌℃硶濡ュ杽鎭㈠鐨勯敊璇殑錛屽畠鍋氱殑浜嬫儏閫氬父灝辨槸logging銆佸彂閫侀敊璇姤鍛娿佸彲鑳戒篃浼氶噸鍚ā鍧椼侳ault Barrier涓鑸湪涓涓唴鑱氱殑鍗曚竴鑱岃矗鐨勫姛鑳芥ā鍧楃殑杈圭晫鍑虹幇銆?br>
涓ユ牸鏉ヨ錛屽叾瀹炶繕鏈夌涓夌鎯呭喌錛屽嵆緙栧啓褰撳墠浠g爜鐨勬椂鍊欏茍涓嶇‘瀹氭煇涓敊璇槸鍚﹁兘琚仮澶嶃傝繖縐嶆椂鍊欐姏鍑轟竴涓紓甯稿線寰鏄渶鐏墊椿鐨勯夋嫨錛屽洜涓哄湪娌℃湁鎯沖ソ鎭㈠鏂規鐨勬椂鍊欙紝涓婂眰璋冪敤瀵硅寮傚父閮芥槸涓珛鐨勩備竴鏃﹀悗闈㈡兂濂芥仮澶嶆柟妗堜簡錛屼笉綆℃槸鍦ㄦ煇涓笂灞傝皟鐢ㄥ唴鎹曡幏璇ュ紓甯革紝榪樻槸鍦ㄦ渶搴曞眰閿欒鍙戠敓鐐逛笂灝辯珛鍗寵В鍐抽敊璇粠鑰屾牴鏈彇娑堟帀璇ュ紓甯革紝閮芥病鏈夐棶棰樸?br>
寮傚父杞崲
鍦ㄥ浣曟姏鍑哄拰鎹曡幏寮傚父鐨勯棶棰樹笂錛岃繕鏈変竴涓瓙闂灝辨槸寮傚父鐨勮漿鎹紙translation錛夈備互涓嬫儏鍐典笅搴旇杞崲涓涓敱搴曞眰浼犱笂鏉ョ殑寮傚父錛?br>
1. 鎶涘嚭涓涓搴斾簬褰撳墠鎶借薄灞傜殑寮傚父銆傛瘮濡侱ocument::open褰撴帴鏀跺埌搴曞眰鐨勬枃浠跺紓甯革紙鎴栨暟鎹簱寮傚父錛岀綉緇滃紓甯革紝鍙栧喅浜庤繖涓狣ocument鏉ヨ嚜浣曟柟錛夋椂錛屽皢鍏惰漿鎹負“鏂囨。鏃犳晥鎴栬鐮村潖”寮傚父錛屽鍔犻珮灞傝鎰忥紝騫墮伩鍏嶆毚闇插簳灞傚疄鐜扮粏鑺傦紙瀵瑰紓甯哥殑涓涓壒璇勫氨鏄細鏆撮湶鍐呴儴瀹炵幇錛岃屽疄闄呬笂錛岄氳繃閫傚綋杞崲寮傚父錛屽彲浠ヤ嬌寰楀紓甯告諱綅浜庡綋鍓嶇殑鎶借薄灞傛涓婏紝鎴愪負鎺ュ彛鐨勪竴閮ㄥ垎錛夈?br>
2. 鍦ㄦā鍧楄竟鐣屼笂銆傚鏋滀竴涓ā鍧楋紝鍦ㄥ唴閮ㄤ嬌鐢ㄥ紓甯革紝浣嗗湪杈圭晫涓婂繀欏繪彁渚汣 API鐨勮瘽錛屽氨蹇呴』鍦ㄨ竟鐣屼笂鎹曡幏寮傚父騫跺皢鍏惰漿鎹負error-code銆?br>
娌℃湁鏃墮棿鏈哄櫒鈥斺旈敊璇鐞嗙殑鏈川鍥伴毦
鍒氭墠鎻愬埌“鍥炴粴”銆傞偅涔堬紝鍦ㄥ紓甯稿彂鐢熺殑鏃跺欙紝濡備綍鍥炴粴鏃㈢劧宸茬粡鍙戠敓鐨勬搷浣滐紵榪欏氨鏄璇寸殑絎笁涓棶棰橈細濡備綍鍦ㄥ紓甯鎬粠鍙戠敓鐐逛竴璺紶鎾埌鎹曡幏鐐圭殑璺緞涓婁繚鎸佸紓甯鎬腑绔嬶紝鍗沖洖婊氭搷浣滐紝閲婃斁璧勬簮銆傜畝鑰岃█涔嬪氨鏄鍋氬埌閿欒瀹夊叏錛坋rror-safe錛夈傞敊璇畨鍏ㄦ敻鍏沖己寮傚父瀹夊叏淇濊瘉鍜屼簨鍔¤鎰忋傚湪寮傚父緙栫▼閲岄潰錛岄敊璇畨鍏ㄦ槸鏈閲嶈鐨勪竴鐜?br>
鐞嗘兂鎯呭喌涓嬶紝鎴戜滑瑕佺殑鏄竴涓椂闂存満鍣細鎵撶鐨勬澂瀛愯鑳借繕鍘燂紝閲婃斁鐨勫唴瀛樿鑳介噸鏂板緱鍒幫紝閿姣佺殑瀵硅薄灝卞儚娌¢攢姣佸墠涓妯′竴鏍鳳紝鍙戝皠鐨勫寮瑰氨鍍忎粠鏉ヤ篃娌℃湁紱誨紑鍙戝皠絳掍竴鏍鳳紝鏁版嵁搴撳氨鍍忎粠鏉ユ病琚啓鍏ヤ竴鏍?#8230;
娌℃湁鏃墮棿鏈哄櫒銆?br>
閭d箞錛屽浣曞洖婊氭湪宸叉垚鑸熺殑鎿嶄綔錛?br>
鐩墠鏈変袱涓富瑕佹柟妗堬細
1. Discard錛堜涪寮冿級錛氫竴涓緥瀛愬氨鑳藉璇存槑榪欑鍋氭硶錛屾簮鑷猄TL鐨?#8220;copy-swap鎵嬫硶”銆傛瘮濡備竴涓獀ector錛屼綘瑕佸線閲岄潰鎻掑叆涓涓厓绱狅紝濡傛灉鎻掑叆鍏冪礌澶辮觸鐨勮瘽浣犳兂瑕乿ector緇存寔鍘熺姸錛屽氨濂藉儚浠庢潵娌℃湁鍔ㄨ繃涓鏍楓傚浣曞仛鍒拌繖涓鐐瑰憿錛熶綘鍙互鍏堟妸榪欎釜vector鎷瘋礉涓浠斤紝寰鎷瘋礉閲岄潰鎻掑叆鍏冪礌錛岀劧鍚庡皢涓や釜vector璋冩崲錛坰wap錛変竴涓嬪嵆鍙紝swap鏄笉浼氬け璐ョ殑錛屽洜涓哄畠鍙槸鎶婁袱涓寚閽堜簰鎹簡涓涓嬨傝屽鏋滃線閭d釜鎷瘋礉閲岄潰鎻掑叆鍏冪礌澶辮觸鐨勮瘽錛屾嫹璐濆氨浼氳Discard錛堜涪寮冩帀錛夛紝涓嶄細甯︽潵浠諱綍瀹為檯鐨勫壇浣滅敤銆傚綋鐒訛紝榪欑鍋氭硶鏄湁浠d環鐨勶紝璋佸彨浣犺寮哄紓甯稿畨鍏ㄤ繚璇佸憿錛熷啀姣斿涓涓嫹璐濊祴鍊兼搷浣滅鍙互榪欐牱鍐欙細MyClass(other).swap(*this); 褰撶劧錛屽墠鎻愯繕鏄痵wap()蹇呴』鍏鋒湁鏍囧噯鐨刵o-throw璇剰銆?br>
榪欑鍋氭硶涓鑸寲鐨勬弿榪板氨鏄細“鍦ㄤ竴涓?#8216;鍓湰’閲屾妸鎵鏈夌殑浜嬫儏閮藉仛濂戒簡錛岀劧鍚庣敤涓涓笉浼氬嚭閿欑殑鍑芥暟鎻愪氦錛坈ommit錛?#8221;銆傝繖鏍蜂竴鏉ワ紝涓斿嚭浜嗕換浣曢敊璇彧瑕佷涪寮冮偅涓壇鏈嵆鍙紙寰寰鍙浠誨叾鏋愭瀯錛夈傝鍋氬埌榪欎竴鐐癸紝涓涓師鍒欏氨鏄細“鍦ㄧ牬鍧忎竴浠戒俊鎭箣鍓嶈紜繚鍏舵柊鐨勭増鏈竴瀹氳兘澶熸棤閿欑殑鏇挎崲鎺夊師淇℃伅”錛屼緥濡傚湪鎷瘋礉鏋勯犲嚱鏁頒腑錛屼笉鑳藉厛delete鍐峮ew錛屽洜涓簄ew鍙兘澶辮觸錛屼竴鏃ew澶辮觸浜嗭紝delete鎺夌殑淇℃伅鍙氨鎵句笉鍥炴潵浜嗐?br>
2. Undo錛堟挙閿錛夛細鏈夋椂鍊欙紝浣犱竴鏂歸潰涓嶆兂浠樺嚭Discard鏂規鐨勶紙閫氬父涓嶈彶鐨勶級絀洪棿寮閿錛屽彟涓鏂歸潰浣犲張鎯蟲嫢鏈夊己寮傚父瀹夊叏淇濊瘉銆傝繖涔熸槸鏈夊姙娉曠殑錛屾瘮濡傦細
void World::addPerson(Person const& person)
{
m_persons.push_back(person);
scope(failure) { m_persons.pop_back(); }
… // other operations
}
scope(failure)鏄疍璇█鐨勭壒鎬э紝鍏惰鎰忔樉鑰屾槗瑙侊細濡傛灉褰撳墠鐨剆cope浠ュけ璐ワ紙寮傚父錛夐鍑虹殑璇濓紝{}鍐呯殑璇彞灝辮鎵ц銆傝繖涔堜竴鏉ワ紝鍦ㄤ笂闈㈢殑渚嬪瓙涓紝濡傛灉鍚庣畫鐨勬搷浣滃け璐ワ紝閭d箞榪欎釜person灝變細琚粠m_persons涓璸op_back鍑烘潵錛屼竴嬈′簨鍔℃挙閿錛屼嬌寰楄繖涓嚱鏁板m_persons鐨勫獎鍝嶅綊闆躲?br>
璇ユ柟妗堢殑鍓嶆彁鏈変袱涓細涓錛屽洖婊氭搷浣滐紙姣斿榪欓噷鐨刴_persons.pop_back()錛夊繀欏誨瓨鍦ㄤ笖涓嶄細澶辮觸錛坣o-throw錛夈傛瘮濡俶issile.lunch()灝變笉鑳藉洖婊氾紝鎿嶄綔緋葷粺API涓鑸篃鏃犳硶鍥炴粴錛汭/O鎿嶄綔涔熸棤娉曞洖婊氾紱鍙︿竴鏂歸潰錛屽唴瀛樻搷浣滀竴鑸岃█閮芥槸鍙互鍥炴粴鐨勶紝鍙鍥炲鍘熸潵鍐呭瓨鐨勫煎嵆鍙備簩錛岃鍥炴粴鐨勬搷浣滐紙姣斿榪欓噷鐨刴_persons.push_back(person)錛変篃涓瀹氳鏄己寮傚父淇濊瘉鐨勩傛瘮濡傚湪涓棿鑰屼笉鏄熬閮ㄦ彃鍏ヤ竴涓猵erson錛坢_persons.insert(iter, person)錛夊氨涓嶆槸寮轟繚璇佺殑錛岃繖縐嶆椂鍊欏氨瑕佽瘔璇稿墠涓涓柟妗堬紙Discard錛夈?br>
D鐨剆cope(failure)錛堣繕鏈塻cope(exit)銆乻cope(success)錛夋槸闈炲父寮哄ぇ鐨勮鏂姐傚埄鐢ㄥ畠錛屼竴涓叿鏈変簨鍔¤鎰忕殑鍑芥暟鐨勪竴鑸ā寮忓涓嬶細
void Transaction()
{
op1; // strong operation
scope(failure) { undo op1; }
op2; // strong operation
scope(failure) { undo op2; }
…
opN; // strong operation
scope(failure) { undo opN; }
}
鍦–++閲岄潰涔熷彲浠ユā鎷烡鐨剆cope(failure)錛孉ndrei Alexandrescu鏇懼疄鐜頒簡涓涓猄copeGuard綾籟11]錛岃屾棬鍦ㄥ畬鍏ㄦā鎷烡鐨剆cope鐗規х殑boost.scope-exit涔熷湪review涓傚彧涓嶈繃C++03閲岄潰鐨勬ā鎷熸柟妗堟湁涓浜涘涔犳洸綰垮拰浣跨敤娉ㄦ剰鐐癸紝C++09涔嬪悗浼氭湁鏇存柟渚跨殑鏂規銆傚湪鍏跺畠涓嶆敮鎸乻cope(failure)鐨勮璦涓紝涔熷彲浠ユā鎷熻繖縐嶅仛娉曪紝涓嶈繃鍋氭硶寰堢鎷欍?br>
3. 鍛?#8230; 鍝潵鐨勭涓変釜鏂規錛熷墠闈笉鏄浜嗗彧鏈変袱涓柟妗堝悧錛熸槸鐨勩傚洜涓鴻繖絎笁涓柟妗堟槸“鐞嗘兂”鏂規錛岀洰鍓嶈繕娌℃湁榪涘叆涓繪祦璇█錛屼笉榪囧湪haskell閲岄潰宸茬粡鍒濊绔簡銆傚己寮傚父瀹夊叏淇濊瘉鐨勬牳蹇冩濇兂鍏跺疄灝辨槸浜嬪姟璇剰錛岃屼簨鍔¤鎰忕殑鏍稿績鎬濇兂灝辨槸“涓嶆垚鍔熶究鎴愪粊”錛堣繖涓濇兂鏈夎澶氭湁瓚g殑璇存硶錛屾瘮濡傦細“姝﹀+閬撳師鍒?#8221;銆?#8220;瑕佷箞鐩寸潃鍥炴潵瑕佷箞妯潃鍥炴潵”銆?#8220;騫蹭笉浜嗗氨鍘繪”錛夛紝鏍規嵁榪欎釜鎯蟲硶錛屽叾瀹炴渶綆鍗曠殑鏂規鏄妸涓緇勫睘浜庡悓涓浜嬪姟鐨勬搷浣滅畝鍗曞湴鍦堣搗鏉ワ紙鏍囪鍑烘潵錛夛紝鎶婂洖婊氭搷浣滅暀緇欒璦瀹炵幇鍘誨畬鎴愶細
stm {
op1;
op2;
…
opN;
}
鍙op1鑷硂pN涓換鎰忎竴涓け璐ワ紝鏁翠釜stm鍧楀鍐呭瓨鐨勫啓鎿嶄綔灝卞叏琚嚜鍔ㄦ姏寮冿紙榪欒姹傜紪璇戝櫒鍜岃繍琛屾椂鐨勬敮鎸侊紝涓鑸槸鐢ㄤ竴涓紦鍐插尯鎴栧啓鏃ュ織鏉ュ疄鐜幫級錛岀劧鍚庡紓甯歌鑷姩鎶涘嚭榪欎釜stm鍧椾箣澶栥傝繖涓柟妗堢殑浼樼偣鏄畠澶紭緹庝簡錛屾垜浠嚑涔庡彧瑕佸叧娉∣ne True Path鍗沖彲錛屽敮涓瑕佸仛鐨勪簨鎯呭氨鏄敤stm{…}鍦堝嚭浠g爜涓渶瑕佸己淇濊瘉鐨勪唬鐮佹銆傝繖涓柟妗堢殑緙虹偣鏈変袱涓細涓錛屽畠璺熺涓涓柟妗堜竴鏍鳳紝鏈夌┖闂村紑閿錛屼笉榪囩┖闂村紑閿閫氬父瑕佸皬涓鐐癸紝鍥犱負鍙緙撳瓨鐗瑰畾鐨勫啓鎿嶄綔銆備簩錛屽綋娑夊強鍒版搷浣滅郴緇烝PI錛孖/O絳?#8220;澶栭儴”鎿嶄綔鐨勬椂鍊欙紝搴曞眰瀹炵幇灝辨湭蹇呰兘澶熷洖婊氳繖浜涙搷浣滀簡銆傚彟涓涓悊璁轟笂鐨勫彲鑳芥ф槸錛屽綋鍥炴粴鎿嶄綔鍜岃鍥炴粴鎿嶄綔騫墮潪涓ユ牸鐗╃悊瀵瑰簲錛堟墍璋撶墿鐞嗗搴斿氨鏄錛屽洖婊氭搷浣滃皢鍐呭瓨鍥炴粴鍒扮洰鏍囨搷浣滃彂鐢熶箣鍓嶇殑鐘舵侊級鐨勬椂鍊欙紝搴曞眰瀹炵幇涔熶笉鐭ラ亾濡備綍鍥炴粴銆?br>
錛圫TM錛堣蔣浠朵簨鍔″唴瀛橈級鐩墠鍦╤askell閲岄潰瀹炵幇浜嗭紝Intel涔熼噴鍑轟簡C/C++鐨凷TM棰勮鐗堢紪璇戝櫒銆傚彧涓嶈繃STM鍘熸湰鐨勬剰鍥炬槸瀹炵幇閿佹棤鍏崇畻娉曠殑銆傚悗鑰呭氨鏄彟涓涓瘽棰樹簡銆傦級
RAII
瀹為檯涓婂垰鎵嶈繕鏈変竴涓棶棰樻病鏈夎錛岄偅灝辨槸濡備綍紜繚璧勬簮涓瀹氫細琚噴鏀撅紙鍗充究鍙戠敓寮傚父錛夛紝榪欏湪D閲岄潰瀵瑰簲鐨勬槸scope(exit)錛屽湪Java閲岄潰瀵瑰簲鐨勬槸finally錛屽湪C# 閲岄潰瀵瑰簲鐨勬槸scoped using銆?br>
綆鑰岃█涔嬪氨鏄紝涓嶇褰撳墠浣滅敤鍩熶互浣曠鏂瑰紡閫鍑猴紝鏌愭煇鎿嶄綔錛堥氬父鏄祫婧愰噴鏀撅級閮戒竴瀹氳琚墽琛屻?br>
榪欎釜闂鐨勭瓟妗堝叾瀹濩++紼嬪簭鍛樹滑搴旇鑰崇啛鑳借浜嗭細RAII銆俁AII鏄疌++鏈涓哄己澶х殑鐗規т箣涓銆傚湪C++閲岄潰錛屽眬閮ㄥ彉閲忕殑鏋愭瀯鍑芥暟鍒氬ソ婊¤凍榪欎釜璇剰錛氭棤璁哄綋鍓嶄綔鐢ㄥ煙浠ヤ綍縐嶆柟寮忛鍑猴紝鎵鏈夊眬閮ㄥ彉閲忕殑鏋愭瀯鍑芥暟閮藉繀鐒朵細琚掔潃璋冪敤涓閬嶃傛墍浠ュ彧瑕佸皢鏈夊緟閲婃斁鐨勮祫婧愬寘瑁呭湪鏋愭瀯鍑芥暟閲岄潰錛屽氨鑳藉淇濊瘉瀹冧滑鍗充究鍦ㄥ紓甯稿彂鐢熺殑鎯呭喌涓嬩篃浼氳閲婃斁鎺変簡銆備負姝++鎻愪緵浜嗕竴緋誨垪鐨勬櫤鑳芥寚閽堬細auto_ptr銆乻coped_ptr銆乻coped_array… 姝ゅ鎵鏈夌殑STL瀹瑰櫒涔熼兘鏄疪AII鐨勩傚湪C++閲岄潰妯℃嫙D鐨剆cope(exit)涔熸槸鍒╃敤鐨凴AII銆?br>
RAII鐩歌緝浜巎ava鐨刦inally鐨勫ソ澶勫拰C#鐨剆coped using鐨勫ソ澶勬槸闈炲父鏄庢樉鐨勩傚彧瑕佷竴孌典唬鐮佸氨楂樹笅绔嬪垽錛?br>
// in Java
String ReadFirstLineFromFile( String path )
{
StreamReader r = null;
String s = null;
try {
r = new StreamReader(path);
s = r.ReadLine();
} finally {
if ( r != null ) r.Dispose();
}
return s;
}
// in C#
String ReadFirstLineFromFile( String path )
{
using ( StreamReader r = new StreamReader(path) ) {
return r.ReadLine();
}
}
鏄劇劧錛孞ava鐗堟湰鐨勶紙try-finally錛夋渶鑷冭偪銆侰#鐗堟湰錛坰coped using錛夌◢寰ソ涓浜涳紝浣唘sing姣曠珶涔熶笉灞炰簬紼嬪簭鍛樺叧蹇冪殑浠g爜閫昏緫錛屼粛鐒跺睘浜庝唬鐮佸櫔闊籌紱鍐典笖濡傛灉涓嶈繛緇湴鐢寵N涓祫婧愮殑璇濓紝浣跨敤using灝變細閫犳垚灞傚眰宓屽緇撴瀯銆?br>
濡傛灉浣跨敤RAII鎵嬫硶鏉ュ皝瑁匰treamReader綾葷殑璇濓紙std::fstream灝辨槸RAII綾葷殑涓涓寖渚嬶級錛屼唬鐮佸氨綆鍖栦負錛?br>
// in C++, using RAII
String ReadFirstLineFromFile(String path)
{
StreamReader r(path);
return r.ReadLine();
}
濂藉鏄樉鑰屾槗瑙佺殑銆傚畬鍏ㄤ笉鐢ㄦ媴蹇冭祫婧愮殑閲婃斁闂錛屼唬鐮佷篃鍙樺緱“as simple as possible”銆傛澶栵紝鍊煎緱娉ㄦ剰鐨勬槸錛屼互涓婁唬鐮佸彧鏄紨紺轟簡鏈綆鍗曠殑鎯呭喌錛屽叾涓渶瑕侀噴鏀劇殑璧勬簮鍙湁涓涓傚叾瀹炶繖涓緥瀛愬茍涓嶈兘鏈鏄庢樉鍦板睍鐜板嚭RAII寮哄ぇ鐨勫湴鏂癸紝褰撻渶瑕侀噴鏀劇殑璧勬簮鏈夊涓殑鏃跺欙紝RAII鐨勭湡姝e己澶т箣澶勬墠琚睍鐜板嚭鏉ワ紝涓鑸湴璇達紝濡傛灉涓涓嚱鏁頒緷嬈$敵璇種涓祫婧愶細
void f()
{
acquire resource1;
…
acquire resource2;
…
acquire resourceN;
…
}
閭d箞錛屼嬌鐢≧AII鐨勮瘽錛屼唬鐮佸氨鍍忎笂闈㈣繖鏍風畝鍗曘傛棤璁轟綍鏃墮鍑哄綋鍓嶄綔鐢ㄥ煙錛屾墍鏈夊凡緇忔瀯閫犲垵濮嬪寲浜嗙殑璧勬簮閮戒細琚瀽鏋勫嚱鏁拌嚜鍔ㄩ噴鏀炬帀銆傜劧鑰屽鏋滀嬌鐢╰ry-finally鐨勮瘽錛宖()灝卞彉鎴愪簡錛?br>
void f()
{
try {
acquire resource1;
… // #1
acquire resource2;
… // #2
acquire resourceN;
… // #N
} finally {
if(resource1 is acquired) release resource1;
if(resource2 is acquired) release resource2;
…
if(resourceN is acquired) release resourceN;
}
}
涓轟粈涔堜細榪欎箞楹葷儲鍛紝鏈川涓婂氨鏄洜涓哄綋鎵ц嫻佸洜寮傚父璺沖埌finally鍧椾腑鏃訛紝浣犲茍涓嶇煡閬撴墽琛屾祦鏄粠#1澶勩?2澶?#8230;榪樻槸#N澶勮煩榪囨潵鐨勶紝鎵浠ヤ綘涓嶇煡閬撳簲璇ラ噴鏀懼摢浜涜祫婧愶紝鍙兘鎸ㄤ釜媯鏌ュ悇涓祫婧愭槸鍚﹀凡緇忚鐢寵浜嗭紝濡傛灉宸茬敵璇蜂簡渚垮皢鍏墮噴鏀撅紱瑕佽兘澶熸鏌ユ瘡涓祫婧愭槸鍚﹀凡緇忚鐢寵浜嗭紝寰寰灝辮姹備綘瑕佸湪鍑芥暟涓寮濮嬪皢鍚勪釜璧勬簮鐨勫彞鏌勫叏閮藉垵濮嬪寲涓簄ull錛岃繖鏍鋒墠鍙互閫氳繃if(hResN==null)鏉ユ鏌ョN涓祫婧愭槸鍚﹀凡緇忕敵璇楓?br>
鏈鍚庯紝RAII鍏跺疄鏄痵cope(exit)鐨勭壒孌婂艦寮忋備絾鍦ㄨ祫婧愰噴鏀炬柟闈紝RAII鏈夊叾鐗規湁鐨勪紭鍔匡細濡傛灉浣跨敤scope(exit)鐨勮瘽錛屾瘡涓祫婧愬垎閰嶄箣鍚庨兘闇瑕佺敤涓涓猻cope(exit)璺熷湪鍚庨潰淇濇姢璧鋒潵錛涜屽鏋滅敤RAII鐨勮瘽錛屼竴涓祫婧愮敵璇峰氨瀵瑰簲浜庝竴涓猂AII瀵硅薄鐨勬瀯閫狅紝閲婃斁宸ヤ綔鍒欒闅愯棌鍦ㄥ璞$殑鏋愭瀯鍑芥暟涓紝浠庤屼嬌浠g爜涓誨共淇濇寔浜嗘竻鐖姐?br>
鎬葷粨
鏈枃璁ㄨ浜嗛敊璇鐞嗙殑鍘熷洜銆佹椂鏈哄拰鏂規硶銆傞敊璇鐞嗘槸緙栫▼涓瀬鍏墮噸瑕佺殑涓鐜紱涔熸槸鏈琚拷瑙嗙殑涓鐜紝Gosling鎶婅繖涓綊鍥犱簬澶у鏁扮▼搴忓憳鍦ㄥ鏍$殑鏃跺欓兘鏄仛鐫澶т綔涓氬綋緙栫▼緇冧範鐨勶紝鑰屽ぇ浣滀笟椴滄湁鑰佸笀瑕佹眰瑕佸Ε鍠勫寰呴敊璇殑錛屽ぇ瀹墮兘鍙“work on the one true path”鍗沖彲錛涚劧鑰岀幇瀹炰笘鐣岀殑杞歡鍙繀欏婚潰瀵瑰悇縐嶅悇鏍風殑鎰忓鎯呭喌錛屽線寰涓涓▼搴忕殑閿欒澶勭悊鏈哄埗鍦ㄧ涓嬈¢潰瀵歸敊璇殑鏃跺欎究宕╂簝浜?#8230; 鍙︿竴鏂歸潰錛岄敊璇鐞嗗張鏄竴涓瀬鍏跺洶闅劇殑闂錛屽叾鏈川鍥伴毦鏉ユ簮浜庝袱涓柟闈細涓錛屽摢浜涙儏鍐電畻鏄敊璇備簩錛屽浣曞仛鍒伴敊璇畨鍏紙error-safe錛夈傜浉杈冧箣涓嬪湪浠涔堝湴鐐硅В鍐抽敊璇掓槸瀹規槗涓浜涗簡銆傛湰鏂囧閿欒澶勭悊鐨勯棶棰樹綔浜嗚緇嗙殑鍒嗘瀽錛屾葷粨浜嗗騫存潵榪欎釜棰嗗煙浜夎鐨勭粨鏋滐紝鎻愪緵浜嗕竴涓疄璺靛寮曘?img src ="http://www.shnenglu.com/alexhappy/aggbug/93906.html" width = "1" height = "1" />
]]>