我查了this篇文章,但不包括我的案例。
如果我理解正确,我们可以在do..catch ..语句中或在可以抛出的函数中使用try
。
但有时候我会看到类似的东西:
let jsonData = try jsonEncoder.encode(employee1)
其中jsonData不是可选的。这是什么意思?如果尝试sttement失败怎么办?为什么价值不是可选的?谁能解释一下?感谢。
答案 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!
变体假设不会抛出任何返回非可选结果,但如果抛出某些东西,应用程序将崩溃。