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

时间:2019-02-22 14:36:19

标签: python exception-handling dart

来自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()

2 个答案:

答案 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>引发的任何异常都将在第一个而不是第二个中被捕获。

在Python中模拟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的其余部分。


在Dart中模拟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不会引发完全相同的种类的异常。