抛出的错误会被错误的捕获所捕获

时间:2017-02-26 16:38:26

标签: ios swift error-handling try-catch realm

我在我的应用中使用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到达。

我如何做到这一点?

1 个答案:

答案 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,为您的错误提供任何代码,了解有关特定数据库错误的更多信息