![](/img/trans.png)
[英]What's the most idiomatic way to implement a stack for `dictionary` type in `Python`?
[英]What is the most idiomatic alternative to Python's try…catch…else in Dart?
来自Python,我真的很想念Dart中try-except
链中的else
子句。
在Dart中模拟else
子句最惯用的是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()
完全披露:我对Dart的整个体验是我刚刚花了2分钟来审查其try
语句的语法。 这完全基于对Python语义的观察。
else
什么用? 跳到建议的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>
抛出异常,则上述代码将无法正确保留堆栈跟踪。 要做到这一点,需要更多的关注:
bool else_exception = false;
try {
...
try {
<last code>
} catch (e) {
else_exception = true;
rethrow;
}
} on SomeError catch (e) {
if (else_exception) {
rethrow;
}
...
}
在大多数情况下,您应该只能在try
块的最后直接写入else
块中的内容。 在某些情况下, 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
不会引发完全相同的异常类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.