在 Dart 中,Python 的 try...catch...else 最惯用的替代方法是什么?

来自 Python,我真的很想念Dartelse中try-except链中的子句。


else在 Dart 中模拟子句最惯用的是什么?


这是一个受益于else块的示例。


这个:


var didFail = false;

try {

    startDownload()

} catch (e) {

    didFail = true;

    downloadFailed()

}   

if (!didFail) {

    downloadSuccess()

}    

afterDownload()

对比:


try {

    startDownload()

} catch (e) {

    downloadFailed()

} else {

    downloadSuccess()    

}

afterDownload()


拉风的咖菲猫
浏览 266回答 2
2回答

子衿沉夜

完全披露:我对 Dart 的全部经验是我刚刚花 2 分钟查看其try语句的语法。这完全基于对 Python 语义的观察。else在 Python中做什么?跳到建议的 Dart 代码答案的末尾。以下两段代码在 Python 中非常相似:try:&nbsp; &nbsp; ...&nbsp; &nbsp; <last code>except SomeError:&nbsp; &nbsp; ...finally:&nbsp; &nbsp; ...和try:&nbsp; &nbsp; ...except SomeError:&nbsp; &nbsp; ...else:&nbsp; &nbsp; <last code>finally:&nbsp; &nbsp; ...<last code>将在两者相同的情况下执行。不同之处在于,由 引发的任何异常<last statement>都将在第一个中捕获,但不会在第二个中捕获。else在 Python 中模拟要else在 Python 中模拟的语义,您将使用附加try语句和标志来指示是否应重新抛出异常。else_exception = Falsetry:&nbsp; &nbsp; ...&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; <last code>&nbsp; &nbsp; except Exception as e:&nbsp; &nbsp; &nbsp; &nbsp; else_exception = Trueexcept SomeError:&nbsp; &nbsp; ...finally:&nbsp; &nbsp; if else_exception:&nbsp; &nbsp; &nbsp; &nbsp; raise e&nbsp; &nbsp; ...我们检查嵌套是否try在finally子句中捕获了异常,因为该else子句会在finally. 如果有异常,现在重新提出它,因为它不会立即被捕获,就像在else. 然后你可以继续剩下的finally。else在 Dart 中模拟据我所知,在 Dart 中也需要相同的逻辑。bool else_exception = false;try {&nbsp; ...&nbsp; try {&nbsp; &nbsp; &nbsp;<last code>&nbsp; } catch (e) {&nbsp; &nbsp; else_exception = true;&nbsp; }} on SomeError catch (e) {&nbsp; ...} finally {&nbsp; if (else_exception) {&nbsp; &nbsp; throw e;&nbsp; }&nbsp; ...}请注意,如果<last code>抛出异常,上面的代码将无法正确保留堆栈跟踪。要做到这一点,需要更多的关注:bool else_exception = false;try {&nbsp; ...&nbsp; try {&nbsp; &nbsp; &nbsp;<last code>&nbsp; } catch (e) {&nbsp; &nbsp; else_exception = true;&nbsp; &nbsp; rethrow;&nbsp; }} on SomeError catch (e) {&nbsp; if (else_exception) {&nbsp; &nbsp; &nbsp;rethrow;&nbsp; }&nbsp; ...}

倚天杖

在大多数情况下,您应该能够else直接在块的最后写入块中的任何内容try。在某些情况下,该else块很有用,并且可以提供更清晰或更富有表现力的代码,但是您可以编写比您在“no else”示例中所做的更紧凑的代码,例如try {&nbsp; &nbsp; start_download() // exception?&nbsp; &nbsp; // yay, no exception&nbsp; &nbsp; download_success()} catch (e) { // preferrably "on KindOfException catch (e)"&nbsp; &nbsp; download_failed()&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}afterDownload()它可能不是作为明确的是download_success只有在没有例外执行,但暗示很明显,因为如果出现了异常,try块将被中止,执行将已经进入了catch块。当然,这也意味着在 中引发的异常download_success()也会进入到catch块中。这可以通过使用更具体的异常来防止,例如on VeryBadDownloadException catch (e),假设start_download和download_success不会引发完全相同类型的异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python