为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2021-11-16 16:20:46
来自 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()
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

完全披露:我对 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在 Python 中模拟的语义,您将使用附加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 中模拟

据我所知,在 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;

  }

  ...

}


查看完整回答
反对 回复 2021-11-16
?
倚天杖

TA贡献1828条经验 获得超3个赞

在大多数情况下,您应该能够else直接在块的最后写入块中的任何内容try。在某些情况下,该else块很有用,并且可以提供更清晰或更富有表现力的代码,但是您可以编写比您在“no 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不会引发完全相同类型的异常。


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信