第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java或C#中異常管理的最佳實(shí)踐

Java或C#中異常管理的最佳實(shí)踐

手掌心 2019-07-29 10:24:21
Java或C#中異常管理的最佳實(shí)踐我一直在決定如何在我的應(yīng)用程序中處理異常。如果我的異常問(wèn)題來(lái)自1)通過(guò)遠(yuǎn)程服務(wù)訪問(wèn)數(shù)據(jù)或2)反序列化JSON對(duì)象。不幸的是,我不能保證這些任務(wù)中的任何一個(gè)都成功(切斷網(wǎng)絡(luò)連接,不正確的JSON對(duì)象,這是我無(wú)法控制的)。因此,如果我遇到異常,我只需在函數(shù)內(nèi)捕獲它并返回FALSE給調(diào)用者。我的邏輯是,所有調(diào)用者真正關(guān)心的是任務(wù)是否成功,而不是為什么它不成功。這是典型方法的一些示例代碼(在JAVA中)public boolean doSomething(Object p_somthingToDoOn){     boolean result = false;     try{         // if dirty object then clean         doactualStuffOnObject(p_jsonObject);         //assume success (no exception thrown)         result = true;     }     catch(Exception Ex)     {         //don't care about exceptions         Ex.printStackTrace();     }     return result;}我認(rèn)為這種方法很好,但我真的很想知道管理異常的最佳實(shí)踐是什么(我應(yīng)該在調(diào)用堆棧中一直冒出異常嗎?)??偨Y(jié)關(guān)鍵問(wèn)題:是否可以捕獲異常但不會(huì)冒泡或正式通知系統(tǒng)(通過(guò)日志或通知用戶)?對(duì)于不會(huì)導(dǎo)致所有需要try / catch塊的異常的最佳實(shí)踐有哪些?跟進(jìn)/編輯感謝所有反饋,在網(wǎng)上找到了一些關(guān)于異常管理的優(yōu)秀來(lái)源:異常處理的最佳實(shí)踐| 奧萊利媒體.NET中的異常處理最佳實(shí)踐最佳實(shí)踐:異常管理(文章現(xiàn)在指向archive.org副本)異常處理反模式似乎異常管理是根據(jù)上下文而變化的事情之一。但最重要的是,人們應(yīng)該如何管理系統(tǒng)中的異常。另外注意通過(guò)過(guò)多的嘗試/捕獲代碼腐爛或不給予例外它的尊重(例外是警告系統(tǒng),還需要警告什么?)。此外,這是m3rLinEz的一個(gè)很好的選擇評(píng)論。我傾向于同意Anders Hejlsberg和你的看法,大多數(shù)來(lái)電者只關(guān)心操作是否成功。從這個(gè)評(píng)論中,它提出了一些在處理異常時(shí)要考慮的問(wèn)題:拋出此異常有什么意義?處理它有什么意義?呼叫者是否真的關(guān)心異常,還是只關(guān)心呼叫是否成功?是否強(qiáng)制調(diào)用者管理潛在的異常優(yōu)雅?你是否尊重這種語(yǔ)言的含義?你真的需要返回像布爾這樣的成功標(biāo)志嗎?返回boolean(或int)更像是一種C思維模式,而不是Java(在Java中你只是處理異常)。遵循與語(yǔ)言相關(guān)的錯(cuò)誤管理結(jié)構(gòu):)!
查看完整描述

3 回答

?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊

對(duì)我來(lái)說(shuō),想要捕獲異常并將它們轉(zhuǎn)換為錯(cuò)誤代碼似乎很奇怪。為什么在后者是Java和C#中的默認(rèn)值時(shí),您認(rèn)為調(diào)用者更喜歡錯(cuò)誤代碼而不是異常?

至于你的問(wèn)題:

  1. 您應(yīng)該只捕獲實(shí)際可以處理的異常。在大多數(shù)情況下,捕獲異常并不是正確的做法。有一些例外(例如,線程之間的日志記錄和編組異常),但即使對(duì)于這些情況,通常也應(yīng)該重新拋出異常。

  2. 你的代碼中絕對(duì)不應(yīng)該有很多try / catch語(yǔ)句。同樣,我們的想法是只捕獲您可以處理的異常。您可以包含一個(gè)最頂層的異常處理程序,將任何未處理的異常轉(zhuǎn)換為對(duì)最終用戶有用的東西,但是否則您不應(yīng)該嘗試捕獲每個(gè)可能位置的每個(gè)異常。


查看完整回答
反對(duì) 回復(fù) 2019-07-29
?
HUH函數(shù)

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊

這取決于應(yīng)用和情況。如果你構(gòu)建一個(gè)庫(kù)組件,你應(yīng)該冒出異常,盡管它們應(yīng)該被包裝成與你的組件一起上下文。例如,如果您構(gòu)建一個(gè)Xml數(shù)據(jù)庫(kù)并假設(shè)您正在使用文件系統(tǒng)來(lái)存儲(chǔ)數(shù)據(jù),并且您正在使用文件系統(tǒng)權(quán)限來(lái)保護(hù)數(shù)據(jù)。您不希望冒出一個(gè)FileIOAccessDenied異常,因?yàn)樗鼤?huì)泄漏您的實(shí)現(xiàn)。相反,您將包裝異常并拋出AccessDenied錯(cuò)誤。如果您將組件分發(fā)給第三方,則尤其如此。

至于是否可以吞下例外。這取決于你的系統(tǒng)。如果您的應(yīng)用程序可以處理故障情況,并且通知用戶失敗的原因沒(méi)有任何好處,那么請(qǐng)繼續(xù),盡管我強(qiáng)烈建議您記錄失敗。我總是覺(jué)得很難打電話來(lái)幫助解決問(wèn)題并發(fā)現(xiàn)他們正在吞下異常(或者替換它并拋出新的異常而不設(shè)置內(nèi)部異常)。

一般來(lái)說(shuō),我使用以下規(guī)則:

  1. 在我的組件和庫(kù)中,如果我打算處理它或基于它做某些事情,我只會(huì)捕獲異常?;蛘?,如果我想在異常中提供其他上下文信息。

  2. 我在應(yīng)用程序入口點(diǎn)或盡可能高的級(jí)別使用常規(guī)try catch。如果異常到達(dá)此處,我只需記錄它并讓它失敗。理想情況下,異常永遠(yuǎn)不會(huì)到達(dá)此處

我發(fā)現(xiàn)以下代碼是一種氣味:

try{
    //do something}catch(Exception){
   throw;}

像這樣的代碼沒(méi)有任何意義,不應(yīng)該包括在內(nèi)。


查看完整回答
反對(duì) 回復(fù) 2019-07-29
?
青春有我

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊

我想就這個(gè)主題推薦另一個(gè)好的來(lái)源。這是對(duì)C#和Java,Anders Hejlsberg和James Gosling的發(fā)明者的訪談,分別是關(guān)于Java的Checked Exception的主題。

失敗和例外

頁(yè)面底部還有很多資源。

我傾向于同意Anders Hejlsberg和你的看法,大多數(shù)來(lái)電者只關(guān)心操作是否成功。

Bill Venners:您提到了關(guān)于已檢查異常的可擴(kuò)展性和版本控制問(wèn)題。你能澄清這兩個(gè)問(wèn)題的含義嗎?

Anders Hejlsberg:讓我們從版本開(kāi)始,因?yàn)閱?wèn)題很容易在那里看到。假設(shè)我創(chuàng)建了一個(gè)聲明它拋出異常A,B和C的方法foo。在foo的第二個(gè)版本中,我想添加一些功能,現(xiàn)在foo可能會(huì)拋出異常D.這對(duì)我來(lái)說(shuō)是一個(gè)徹底的改變。將D添加到該方法的throws子句中,因?yàn)樵摲椒ǖ默F(xiàn)有調(diào)用者幾乎肯定不會(huì)處理該異常。

在新版本中向throws子句添加新異常會(huì)破壞客戶端代碼。這就像在界面中添加方法一樣。在發(fā)布接口之后,它實(shí)際上是不可變的,因?yàn)樗娜魏螌?shí)現(xiàn)都可能具有您要在下一個(gè)版本中添加的方法。所以你必須創(chuàng)建一個(gè)新的界面。與異常類(lèi)似,您可能必須創(chuàng)建一個(gè)名為foo2的全新方法,該方法會(huì)拋出更多異常,或者您必須在新foo中捕獲異常D,并將D轉(zhuǎn)換為A,B或C.

Bill Venners:但是你不是在這種情況下破壞他們的代碼,即使是在沒(méi)有檢查異常的語(yǔ)言中嗎?如果foo的新版本將拋出一個(gè)客戶應(yīng)該考慮處理的新異常,那么他們的代碼是不是因?yàn)樗麄冊(cè)诰帉?xiě)代碼時(shí)沒(méi)有預(yù)料到異常這一事實(shí)?

Anders Hejlsberg:不,因?yàn)樵诤芏嗲闆r下,人們并不關(guān)心。他們不會(huì)處理任何這些例外情況。它們的消息循環(huán)周?chē)幸粋€(gè)底層異常處理程序。那個(gè)處理程序只是打開(kāi)一個(gè)對(duì)話框,說(shuō)明出了什么問(wèn)題并繼續(xù)。程序員通過(guò)在任何地方編寫(xiě)try finally來(lái)保護(hù)他們的代碼,因此如果發(fā)生異常他們將正確退出,但他們實(shí)際上并不感興趣處理異常。

throws子句,至少它在Java中的實(shí)現(xiàn)方式,并不一定會(huì)強(qiáng)制您處理異常,但如果您不處理它們,它會(huì)強(qiáng)制您確切地確認(rèn)哪些異??赡軙?huì)通過(guò)。它要求您捕獲聲明的異?;?qū)⑺鼈兎旁谀约旱膖hrows子句中。為了解決這個(gè)問(wèn)題,人們做了荒謬的事情。例如,他們用“拋出異常”來(lái)裝飾每個(gè)方法。這完全打敗了這個(gè)功能,你只是讓程序員寫(xiě)了更多的gobbledy gunk。這對(duì)任何人都沒(méi)有幫助。

編輯:添加了有關(guān)轉(zhuǎn)換的更多詳細(xì)信息


查看完整回答
反對(duì) 回復(fù) 2019-07-29
  • 3 回答
  • 0 關(guān)注
  • 558 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)