我在我的应用中使用Realm。我正在尝试为所有类型的错误实现一个统一的错误处理接口。例如,我有一个处理所有User
相关任务的类。所以我有一个名为UserError
的枚举。
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)
}
}
}
我有一个单独的catch-all databaseError
枚举值来捕获所有与Realm相关的错误。
我的方法的问题是,当我在查询数据库的doesNotExist
内抛出do-catch
错误时,该错误会被此方法{{1并被重新抛出为catch
。我希望错误以原始类型databaseError
到达。
我如何做到这一点?
答案 0 :(得分:1)
您的catch
子句是不合格的,因此会捕获do
子句中抛出的每个错误,无论它是领域错误还是UserError
。您可以尝试使catch子句成为条件,因为如果错误确实是Realm错误,您只想抛出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
,为您的错误提供任何代码,了解有关特定数据库错误的更多信息