首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python的try…最常用的替代方案是什么捕获…在Dart里还有什么吗?

问Python的try…最常用的替代方案是什么捕获…在Dart里还有什么吗?
EN

Stack Overflow用户
提问于 2019-02-22 22:36:19
回答 2查看 183关注 0票数 3

来自Python,我真的很怀念Dart中try-except链中的else子句。

在Dart中模拟else子句最常用的方法是什么?

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

这一点:

代码语言:javascript
复制
var didFail = false;
try {
    startDownload()
} catch (e) {
    didFail = true;
    downloadFailed()
}   
if (!didFail) {
    downloadSuccess()
}    
afterDownload()

vs:

代码语言:javascript
复制
try {
    startDownload()
} catch (e) {
    downloadFailed()
} else {
    downloadSuccess()    
}
afterDownload()
EN

回答 2

Stack Overflow用户

发布于 2019-02-22 22:56:37

完全公开:我使用Dart的全部经验就是我刚刚花了2分钟来检查它的try语句的语法。这完全是基于对Python语义的观察。

else在Python中做什么?

跳到建议的Dart代码的答案末尾。

以下两段代码在Python中非常相似:

代码语言:javascript
复制
try:
    ...
    <last code>
except SomeError:
    ...
finally:
    ...

和

代码语言:javascript
复制
try:
    ...
except SomeError:
    ...
else:
    <last code>
finally:
    ...

在这两种情况下,<last code>都会被执行。不同之处在于,<last statement>引发的任何异常都将在第一个异常中捕获,而不是在第二个异常中捕获。

在Python中模拟else

要在Python语言中模拟else的语义,可以使用一个额外的try语句和一个标志来指示是否应该重新抛出异常。

代码语言:javascript
复制
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中也是必要的。

代码语言:javascript
复制
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>抛出异常,上述代码将无法正确保留堆栈跟踪。要做到这一点,需要更多的关注:

代码语言:javascript
复制
bool else_exception = false;
try {
  ...
  try {
     <last code>
  } catch (e) {
    else_exception = true;
    rethrow;
  }
} on SomeError catch (e) {
  if (else_exception) {
     rethrow;
  }
  ...
}
票数 2
EN

Stack Overflow用户

发布于 2019-02-22 23:04:34

在大多数情况下,您应该能够直接在try块的末尾将任何内容写入else块。在some cases中,else块可能很有用,可以提供更清晰或更具表现力的代码,但是,例如,您可以编写比在“没有其他”示例中所做的更紧凑的代码,例如

代码语言:javascript
复制
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不会引发完全相同类型的异常。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54829404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档