来自Python,我真的很怀念Dart中try-except链中的else子句。
在Dart中模拟else子句最常用的方法是什么?
下面是一个受益于else块的示例。
这一点:
var didFail = false;
try {
startDownload()
} catch (e) {
didFail = true;
downloadFailed()
}
if (!didFail) {
downloadSuccess()
}
afterDownload()vs:
try {
startDownload()
} catch (e) {
downloadFailed()
} else {
downloadSuccess()
}
afterDownload()发布于 2019-02-22 22:56:37
完全公开:我使用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>引发的任何异常都将在第一个异常中捕获,而不是在第二个异常中捕获。
在Python中模拟else
要在Python语言中模拟else的语义,可以使用一个额外的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的其余部分。
在Dart中模拟else
据我所知,同样的逻辑在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;
}
...
}发布于 2019-02-22 23:04:34
在大多数情况下,您应该能够直接在try块的末尾将任何内容写入else块。在some cases中,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不会引发完全相同类型的异常。
https://stackoverflow.com/questions/54829404
复制相似问题