2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
完全披露:我對(duì) Dart 的全部經(jīng)驗(yàn)是我剛剛花 2 分鐘查看其try語(yǔ)句的語(yǔ)法。這完全基于對(duì) Python 語(yǔ)義的觀察。
else在 Python中做什么?
跳到建議的 Dart 代碼答案的末尾。
以下兩段代碼在 Python 中非常相似:
try:
...
<last code>
except SomeError:
...
finally:
...
和
try:
...
except SomeError:
...
else:
<last code>
finally:
...
<last code>將在兩者相同的情況下執(zhí)行。不同之處在于,由 引發(fā)的任何異常<last statement>都將在第一個(gè)中捕獲,但不會(huì)在第二個(gè)中捕獲。
else在 Python 中模擬
要else在 Python 中模擬的語(yǔ)義,您將使用附加try語(yǔ)句和標(biāo)志來(lái)指示是否應(yīng)重新拋出異常。
else_exception = False
try:
...
try:
<last code>
except Exception as e:
else_exception = True
except SomeError:
...
finally:
if else_exception:
raise e
...
我們檢查嵌套是否try在finally子句中捕獲了異常,因?yàn)樵揺lse子句會(huì)在finally. 如果有異常,現(xiàn)在重新提出它,因?yàn)樗粫?huì)立即被捕獲,就像在else. 然后你可以繼續(xù)剩下的finally。
else在 Dart 中模擬
據(jù)我所知,在 Dart 中也需要相同的邏輯。
bool else_exception = false;
try {
...
try {
<last code>
} catch (e) {
else_exception = true;
}
} on SomeError catch (e) {
...
} finally {
if (else_exception) {
throw e;
}
...
}
請(qǐng)注意,如果<last code>拋出異常,上面的代碼將無(wú)法正確保留堆棧跟蹤。要做到這一點(diǎn),需要更多的關(guān)注:
bool else_exception = false;
try {
...
try {
<last code>
} catch (e) {
else_exception = true;
rethrow;
}
} on SomeError catch (e) {
if (else_exception) {
rethrow;
}
...
}

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在大多數(shù)情況下,您應(yīng)該能夠else直接在塊的最后寫入塊中的任何內(nèi)容try。在某些情況下,該else塊很有用,并且可以提供更清晰或更富有表現(xiàn)力的代碼,但是您可以編寫比您在“no else”示例中所做的更緊湊的代碼,例如
try {
start_download() // exception?
// yay, no exception
download_success()
} catch (e) { // preferrably "on KindOfException catch (e)"
download_failed()
}
afterDownload()
它可能不是作為明確的是download_success只有在沒(méi)有例外執(zhí)行,但暗示很明顯,因?yàn)槿绻霈F(xiàn)了異常,try塊將被中止,執(zhí)行將已經(jīng)進(jìn)入了catch塊。
當(dāng)然,這也意味著在 中引發(fā)的異常download_success()也會(huì)進(jìn)入到catch塊中。這可以通過(guò)使用更具體的異常來(lái)防止,例如on VeryBadDownloadException catch (e),假設(shè)start_download和download_success不會(huì)引發(fā)完全相同類型的異常。
添加回答
舉報(bào)