抛出的错误被抓到错误catch
问题描述:
我在我的应用程序中使用Realm。我正在尝试为所有类型的错误实现一个统一的错误处理接口。例如,我有一个类可以处理所有User
相关的任务。所以我有一个名为UserError
的枚举。抛出的错误被抓到错误catch
import Foundation
import RealmSwift
enum UserError: Error {
case doesNotExist
case alreadyExists
case databaseError(error: Error)
}
class UserHelper {
/// Fetch user object for the given email if exists.
func getUser(forEmail email: String) throws -> User {
do {
guard let user = try Realm().object(ofType: User.self, forPrimaryKey: email) else {
throw UserError.doesNotExist
}
return user
} catch {
throw UserError.databaseError(error: error)
}
}
}
我有一个单独的包罗万象的databaseError
枚举值来捕获所有领域相关的错误。
我的方法的问题是,当我扔在那里我查询数据库的do-catch
内doesNotExist
错误,该错误被内部抓住了这个方法的catch
和被重新抛出作为databaseError
。我希望错误以原始类型doesNotExist
到达。
我该如何做到这一点?
答
您的catch
子句不合格,因此会捕获do
子句中引发的每个错误,无论它是否为Realm错误或UserError
。你可以尝试使catch子句条件,因为你只需要抛出一个databaseError()
如果错误确实是一个境界错误:
do {
guard let user = try Realm().object(ofType: User.self, forPrimaryKey: email) else {
throw UserError.doesNotExist
}
return user
} catch let error as Realm.Error {
throw UserError.databaseError(error: error)
}
如果你这样做,你也可以改变你的UserError.databaseError
情况下采取Realm.Error
代替一个普通的Error
,给任何代码捕获错误更多关于特定数据库错误的信息。
它的工作原理!谢谢。 – Isuru