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不会引发完全相同类型的异常。
添加回答
举报