来自Python,我真的很想念Dart else
链中的try-except
子句。
在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()
答案 0 :(得分:2)
完全公开:我在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
的语义,您将使用附加的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中,相同的逻辑是必要的。
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>
引发异常,则以上代码 not 将正确保留堆栈跟踪。为此,需要更多注意:
bool else_exception = false;
try {
...
try {
<last code>
} catch (e) {
else_exception = true;
rethrow;
}
} on SomeError catch (e) {
if (else_exception) {
rethrow;
}
...
}
答案 1 :(得分:-1)
在大多数情况下,您应该只能够直接在try
块的末尾写入else
块中的任何内容。在try {
start_download() // exception?
// yay, no exception
download_success()
} catch (e) { // preferrably "on KindOfException catch (e)"
download_failed()
}
afterDownload()
块中可能有用some cases,并且可以提供更清晰或更表达力强的代码,但是例如,您可以编写代码,比“别无其他”的代码紧凑得多。 “示例为
download_success
try
仅在没有异常的情况下才执行,可能并不那么明确,但是隐式很明显,因为 if 那里 是一个例外,catch
块将被中止,执行将进入download_success()
块。
当然,这也意味着catch
中引发的异常也将进入on VeryBadDownloadException catch (e)
块。这可以通过使用更具体的例外情况来防止,例如start_download
,假设download_success
和$varname
不会引发完全相同的种类的异常。