繁体   English   中英

什么是Python的最惯用的替代方案...在Dart中捕捉......其他?

[英]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语义的观察。


Python中else什么用?

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

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_downloaddownload_success不会引发完全相同的异常类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM