在 Swift 中,在 try-catch 或 do-catch 中声明的 defer 语句何时执行

问题描述 投票:0回答:1

defer 语句应该在声明它的块之后执行。如果在 try-catch 的 try 块或 do-catch 的 do 块内声明 defer 语句,它是在 catch 块之前还是之后执行?

例如,给定以下 do-catch 块

print("one")
do {
  print("two")
  defer { print("three")}
  // do something that might cause an error
} catch {
  print("four")
}
print("five")

如果 do 块抛出错误/异常,则 defer 作用域为 do 块,以便 defer 打印在 catch 打印之前执行,如下所示:

one
two
three
four
five

或者 defer 语句的作用域是整个 do-catch 块,这样 do 块中抛出的错误会导致 defer 语句 print 在 catch 块 print 语句之后执行?

one
two
four
three
five

非常感谢您的帮助

swift scope try-catch deferred do-catch
1个回答
0
投票

这里有一些可以在 Playground 中运行的代码

enum Err: Error
{
    case throwMe
}
print("one")
do {
    defer { print("three")}
    print("two")
    throw Err.throwMe
} catch {
     print("four")
}
print("five")

这是输出

one
two
three
four
five

因此我们可以说,延迟语句在错误导致

do
块退出之后执行,但在
catch
块执行之前执行。

如果我没有尝试的话,这就是我的猜测。

© www.soinside.com 2019 - 2024. All rights reserved.