我尝试在Swift2中使用错误处理建模。
do {
try NSFileManager.defaultManager().removeItemAtPath("path")
} catch {
// ...
} finally {
// compiler error.
}
但似乎没有finally
关键字。如何在Swift中实现try-catch-finally pattern
。欢迎提供帮助。
答案 0 :(得分:18)
如果您正在考虑将SWIFT 2.0错误处理与异常相同,那么您就会产生误解。
这也不例外,这是一个符合名为ErrorType
的协议的错误。
该块的目的是拦截投掷函数或方法抛出的错误
基本上没有finally
,您可以做的是将代码包装在defer
块中,这保证是执行和范围的结束。
这是来自SWIFT 2 programming guide
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
/* Work with the file. */
}
// close(file) is called here, at the end of the scope.
}
}
使用defer语句执行之前的一组语句 代码执行离开了当前的代码块。这可以让你做任何事情 无论是否进行必要的清理工作都应该进行 发生了错误。示例包括关闭任何打开的文件描述符和 释放任何手动分配的内存。
答案 1 :(得分:9)
延迟就像一个终结,这意味着swift确保您在当前函数范围的末尾执行该延迟代码。 以下是我需要了解的一些要点: 1)即使后卫都会回来 2)我们可以编写多个延迟范围
以下是演示多个延迟的示例和输出:
func myMethod() {
print("Message one")
print("Message two")
print("Message three")
defer {
print("defered block 3")
}
defer {
print("defered block 2")
}
defer {
print("defered block 1")
}
print("Message four")
print("Message five")
}
Output:
Message one
Message two
Message three
Message four
Message five
defered block 1
defered block 2
defered block 3
答案 2 :(得分:3)
您要找的是defer
。它定义了一个代码块,在执行即将离开当前作用域之前不会执行,但它总是被执行。
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
/* Work with the file. */
}
// close(file) is called here, at the end of the scope.
}
}
有关defer
的详细信息,请查看Apple Swift documentation, especially section "Specifying Clean-up Actions"。
答案 3 :(得分:2)
Swift 2使用defer关键字
引入了自己对此要求的看法defer {
print("Do clean up here")
}
Swift 2中的 finally
= defer
。
defer关键字
的文章答案 4 :(得分:0)
请阅读:The defer keyword in Swift 2: try/finally done right
例如:
print("Step 1")
do {
defer { print("Step 2") }
print("Step 3")
print("Step 4")
}
print("Step 5")
输出:1,3,4,2,5