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;
}
...
}

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不會引發完全相同類型的異常。
添加回答
舉報