do语句
问题描述:
比方说,这是我们从模型中删除对象功能:do语句
func delete(indexPath: IndexPath) {
let managedObject = self.fetchedResultsController.object(at: indexPath)
self.managedObjectContext.delete(managedObject)
do {
// Save changes
try self.managedObjectContext.save()
// Cancel the notification
let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!])
center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!])
// Reload tableView
self.tableView.reloadData()
} catch {
let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert)
alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in
// Completion handler
}))
self.present(alertController, animated: true, completion: {
// Completion block
})
}
}
问:
如果错误抛出,执行转移到catch
条款。这很好。但是这些语句会发生什么(其余的代码,取消通知和重新加载tableView)?那些语句仍然可执行或简单地被忽略?
答
如果您希望即使发生错误仍然调用您的代码,您可以为其创建单独的函数,并从do
和catch
语句的末尾调用它。或者您可以将该代码放在defer
声明中。
要么像
func delete(indexPath: IndexPath) {
let managedObject = self.fetchedResultsController.object(at: indexPath)
self.managedObjectContext.delete(managedObject)
do {
// Save changes
try self.managedObjectContext.save()
reloadCode()
} catch {
reloadCode()
let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert)
alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in
// Completion handler
}))
self.present(alertController, animated: true, completion: {
// Completion block
})
}
}
func reloadCode() {
// Cancel the notification
let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!])
center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!])
// Reload tableView
self.tableView.reloadData()
}
或者更整齐,
FUNC删除(indexPath:IndexPath){
let managedObject = self.fetchedResultsController.object(at: indexPath)
self.managedObjectContext.delete(managedObject)
defer {
let center = UNUserNotificationCenter.current()
center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!])
center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!])
// Reload tableView
self.tableView.reloadData()
}
do {
// Save changes
try self.managedObjectContext.save()
// Cancel the notification
} catch {
let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert)
alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in
// Completion handler
}))
self.present(alertController, animated: true, completion: {
// Completion block
})
}
}
只要误差在此抛出行尝试self.managedObjectContext.save()',其余的代码将不会运行,它会进入catch语句。即使发生错误,您是否仍想运行语句? –
@ShamasS不!抛出错误时,我不需要任何语句。感谢您的评论 – Mannopson
这些行将被忽略,因为前一行出现错误。如果这就是你想要的,那就是发生了什么,你能否重新解释你的问题? –