单一尝试在Swift中的含义

时间:2018-01-03 17:49:54

标签: swift

我查了this篇文章,但不包括我的案例。

如果我理解正确,我们可以在do..catch ..语句中或在可以抛出的函数中使用try

但有时候我会看到类似的东西:

let jsonData = try jsonEncoder.encode(employee1)

其中jsonData不是可选的。这是什么意思?如果尝试sttement失败怎么办?为什么价值不是可选的?谁能解释一下?感谢。

2 个答案:

答案 0 :(得分:3)

除了您提到的案例外,您还可以致电try 顶级代码。这是一个简单的自包含示例:

// main.swift:
enum MyError : Error {
    case failed
}

func foo() throws -> Int   {
    throw MyError.failed
}

defer { print("Good bye.") }

let x = try foo()
print(x)

你可以编译并运行它作为Xcode“命令行项目” 或直接从命令行:

$ swiftc main.swift

$ ./main
Good bye.
Fatal error: Error raised at top level: main.MyError.failed: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.74.1/src/swift/stdlib/public/core/ErrorType.swift, line 187
Illegal instruction: 4

顶级代码中失败的try会导致程序进入 终止并显示错误消息。然而,将执行延期声明(如果存在)。

这与使用强制try!语句略有不同, 这导致程序也中止,但是立即而不执行延迟语句。(如果延期,这可能是相关的 语句用于清理资源,例如删除临时文件。)

错误消息来自ErrorType.swift, line 187

/// Invoked by the compiler when code at top level throws an uncaught error.
@_inlineable // FIXME(sil-serialize-all)
@_silgen_name("swift_errorInMain")
public func _errorInMain(_ error: Error) {
  fatalError("Error raised at top level: \(String(reflecting: error))")
}

(也在Non Exhaustive List When Handling Errors Inside a Class Function in Swift中观察到)。

显然,顶级代码的行为就像嵌入在a中一样 do-catch块:

do {
    func foo() throws -> Int   {
        throw NSError(domain: "foo", code: 0, userInfo: nil)
    }

    defer { print("Good bye.") }

    let x = try foo()
} catch {
    fatalError("Error raised at top level: \(String(reflecting: error))")
}

答案 1 :(得分:1)

如您所述,标记为try的函数调用(如您所发布的)必须位于标有关键字throws或do / catch语句的函数内,否则将导致编译错误。

另外,如果你想在do / catch或其他throw函数之外调用throw函数,你可以在函数调用之前使用try?来得到nil的可选结果。抛出一些东西。还有try!变体假设不会抛出任何返回非可选结果,但如果抛出某些东西,应用程序将崩溃。