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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

try / catch / throw和try / catch(e)/ throw e之間的區(qū)別

try / catch / throw和try / catch(e)/ throw e之間的區(qū)別

C#
手掌心 2019-11-11 13:07:28
之間有什么區(qū)別try { }catch{ throw; }和try { }catch(Exception e){ throw e;}?我什么時候應(yīng)該使用另一個?
查看完整描述

3 回答

?
海綿寶寶撒

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

建筑


try { ... }

catch () { ... } /* You can even omit the () here */


try { ... }

catch (Exception e) { ... }

兩者相似,因為兩者都將捕獲塊中拋出的每個異常try(并且,除非您只是使用它來記錄異常,否則應(yīng)避免)?,F(xiàn)在來看這些:


try { ... }

catch ()

{

    /* ... */

    throw;

}


try { ... }

catch (Exception e)

{

    /* ... */

    throw;

}


try { ... }

catch (Exception e)

{

    /* ... */

    throw e;

}

第一個try-catch塊和第二個try-catch塊完全相同,它們只是重新拋出當(dāng)前異常,并且該異常將保留其“源”和堆棧跟蹤。


第三個try-catch塊是不同的。當(dāng)它引發(fā)異常時,它將更改源和堆棧跟蹤,以便看起來已從此方法引發(fā)異常,從throw e包含try-catch塊的方法的那一行開始。


您應(yīng)該使用哪一個?這實際上取決于每種情況。


假設(shè)您有一個Person帶有.Save()將其持久化到數(shù)據(jù)庫中的方法的類。假設(shè)您的應(yīng)用程序在Person.Save()某處執(zhí)行該方法。如果您的數(shù)據(jù)庫拒絕保存Person,.Save()則將引發(fā)異常。您應(yīng)該使用throw還是throw e在這種情況下?這要看情況。


我更喜歡做的是:


try {

    /* ... */

    person.Save();

}

catch(DBException e) {

    throw new InvalidPersonException(

       "The person has an invalid state and could not be saved!",

       e);

}

這應(yīng)該將DBException作為正在拋出的較新異常的“內(nèi)部異常”。因此,當(dāng)您檢查此InvalidPersonException時,堆棧跟蹤將包含返回Save方法的信息(這可能足以解決問題),但是如果需要,您仍然可以訪問原始異常。


最后一點(diǎn),當(dāng)您期望一個異常時,您應(yīng)該確實捕獲該特定的異常,而不是一般的異常Exception,即,如果您期望一個InvalidPersonException,則您應(yīng)該首選:


try { ... }

catch (InvalidPersonException e) { ... }


try { ... }

catch (Exception e) { ... }

祝好運(yùn)!


查看完整回答
反對 回復(fù) 2019-11-11
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗 獲得超2個贊

第一個保留堆棧跟蹤,而第二個重置堆棧跟蹤。這意味著,如果您使用第二種方法,則異常的堆棧跟蹤將始終從該方法開始,并且您將丟失原始的異常跟蹤,這對于讀取異常日志的人可能是災(zāi)難性的,因為他將永遠(yuǎn)找不到異常的原始原因。 。


當(dāng)您想向堆棧跟蹤中添加其他信息時,第二種方法可能會很有用,但它的用法如下:


try

{

    // do something

}

catch (Exception ex)

{

    throw new Exception("Additional information...", ex);

}


查看完整回答
反對 回復(fù) 2019-11-11
?
犯罪嫌疑人X

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

無參數(shù)catch和a之間的區(qū)別catch(Exception e)是您可以引用該異常。從框架版本2開始,非托管異常包裝在托管異常中,因此無參數(shù)異常不再對任何事物都有用。


throw;和之間的區(qū)別throw e;是,第一個用于引發(fā)異常,第二個用于引發(fā)新創(chuàng)建的異常。如果使用第二個異常拋出異常,它將把它當(dāng)作新異常對待,并替換最初拋出異常時的所有堆棧信息。


因此,您不要在問題中使用任何一種替代方法。您不應(yīng)使用無參數(shù)捕獲,而應(yīng)使用它throw;來拋出異常。


同樣,在大多數(shù)情況下,對于所有異常,應(yīng)使用比基類更具體的異常類。您應(yīng)該只捕獲預(yù)期的異常。


try {

   ...

} catch (IOException e) {

   ...

   throw;

}

如果要在引發(fā)異常時添加任何信息,請創(chuàng)建一個新異常,并將原始異常作為內(nèi)部異常保留所有信息:


try {

   ...

} catch (IOException e) {

   ...

   throw new ApplicationException("Some informative error message", e);

}


查看完整回答
反對 回復(fù) 2019-11-11
  • 3 回答
  • 0 關(guān)注
  • 919 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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