亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在 Dart 中,Python 的 try...catch...else 最慣用的替代方法是什么?

在 Dart 中,Python 的 try...catch...else 最慣用的替代方法是什么?

拉風的咖菲貓 2021-11-16 16:20:46
來自 Python,我真的很想念Dartelse中try-except鏈中的子句。else在 Dart 中模擬子句最慣用的是什么?這是一個受益于else塊的示例。這個:var didFail = false;try {    startDownload()} catch (e) {    didFail = true;    downloadFailed()}   if (!didFail) {    downloadSuccess()}    afterDownload()對比:try {    startDownload()} catch (e) {    downloadFailed()} else {    downloadSuccess()    }afterDownload()
查看完整描述

2 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

完全披露:我對 Dart 的全部經驗是我剛剛花 2 分鐘查看其try語句的語法。這完全基于對 Python 語義的觀察。


else在 Python中做什么?

跳到建議的 Dart 代碼答案的末尾。


以下兩段代碼在 Python 中非常相似:


try:

    ...

    <last code>

except SomeError:

    ...

finally:

    ...


try:

    ...

except SomeError:

    ...

else:

    <last code>

finally:

    ...

<last code>將在兩者相同的情況下執行。不同之處在于,由 引發的任何異常<last statement>都將在第一個中捕獲,但不會在第二個中捕獲。


else在 Python 中模擬

要else在 Python 中模擬的語義,您將使用附加try語句和標志來指示是否應重新拋出異常。


else_exception = False

try:

    ...

    try:

        <last code>

    except Exception as e:

        else_exception = True

except SomeError:

    ...

finally:

    if else_exception:

        raise e

    ...

我們檢查嵌套是否try在finally子句中捕獲了異常,因為該else子句會在finally. 如果有異常,現在重新提出它,因為它不會立即被捕獲,就像在else. 然后你可以繼續剩下的finally。


else在 Dart 中模擬

據我所知,在 Dart 中也需要相同的邏輯。


bool else_exception = false;

try {

  ...

  try {

     <last code>

  } catch (e) {

    else_exception = true;

  }

} on SomeError catch (e) {

  ...

} finally {

  if (else_exception) {

    throw e;

  }

  ...

}

請注意,如果<last code>拋出異常,上面的代碼將無法正確保留堆棧跟蹤。要做到這一點,需要更多的關注:


bool else_exception = false;

try {

  ...

  try {

     <last code>

  } catch (e) {

    else_exception = true;

    rethrow;

  }

} on SomeError catch (e) {

  if (else_exception) {

     rethrow;

  }

  ...

}


查看完整回答
反對 回復 2021-11-16
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

在大多數情況下,您應該能夠else直接在塊的最后寫入塊中的任何內容try。在某些情況下,該else塊很有用,并且可以提供更清晰或更富有表現力的代碼,但是您可以編寫比您在“no else”示例中所做的更緊湊的代碼,例如


try {

    start_download() // exception?

    // yay, no exception

    download_success()

} catch (e) { // preferrably "on KindOfException catch (e)"

    download_failed()        

}

afterDownload()

它可能不是作為明確的是download_success只有在沒有例外執行,但暗示很明顯,因為如果出現了異常,try塊將被中止,執行將已經進入了catch塊。


當然,這也意味著在 中引發的異常download_success()也會進入到catch塊中。這可以通過使用更具體的異常來防止,例如on VeryBadDownloadException catch (e),假設start_download和download_success不會引發完全相同類型的異常。


查看完整回答
反對 回復 2021-11-16
  • 2 回答
  • 0 關注
  • 298 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號