我正在处理一段代码,它将从CoreData中获取NSManagedObject
的数组。在我的代码中使用do catch语句时,这样做似乎不对,但这是我编写这行代码的最简单方法。
在使用return
语句的任何其他情况下,您将跳出当前所处的函数。并且您可以放心,函数中没有其他代码会执行return
之后的任何代码。声明。我想知道这同样适用于Swift的do catch
范例。
class func getAll() -> [MMNotification] {
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<MMNotification>(entityName: "MMNotification")
do {
return try context.fetch(fetchRequest)
}
catch {
// Will this 'catch' if the try fails,
// even if we said we are 'return'ing right before the 'try'?
return []
}
}
这里我将获取存储在CoreData中的通知列表。在do
块中,您可以看到相关的代码行。
问题
如果catch
在已经声明该函数应该try
之后失败,那么return
块是否会执行?
答案 0 :(得分:2)
你所拥有的应该按预期工作。基本上发生的事情是如果在do中的任何时间发生抛出,则调用catch并且不会执行throw之后的任何代码。
答案 1 :(得分:1)
是,如果z
中的catch
失败,则会执行try
阻止。回报不会发生。
这里有一些代码可以证明这一点。将它粘贴到一个新的操场上进行试用。
return try
当import UIKit
let shouldFail = true
enum DemoError:Error {
case shouldFail
}
func failableGetter() throws -> String {
if shouldFail { throw DemoError.shouldFail }
return "Succeeded"
}
func fetchInfo() -> String {
do {
return try failableGetter()
} catch {
return "Failed"
}
}
print(fetchInfo()) // "Failed" or "Succeeded" depending on shouldFail
为shouldFail
时,true
会引发错误,failableGetter()
中的do-catch
会在返回之前跳到catch部分。
当fetchInfo()
为shouldFail
时,false
不会失败,failableGetter()
会返回结果。
答案 2 :(得分:0)
添加到this answer。范围在这里有点重要。抛出之后,do
块代码内的代码将不会执行。但是,将执行do
块范围之外的代码。我做了一个简单的游乐场,你可以自己去看看。
import Foundation
let error = NSError(domain: "", code: 123, userInfo: [NSLocalizedDescriptionKey: "My error"])
func functionThatAlwaysThrows() throws {
throw(error)
}
func myFunction() {
do {
try functionThatAlwaysThrows()
// This will never print
print("Continuing after throw inside do scope")
} catch let err {
print("Caught Error: \(err.localizedDescription)")
}
// This will always print
print("Continuing after throw outside do scope")
}
输出:
Caught Error: My error
Continuing after throw outside do scope
如果您想了解有关错误处理的更多信息,可以查看the docs