抛出的错误被抓到错误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-catchdoesNotExist错误,该错误被内部抓住了这个方法的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,给任何代码捕获错误更多关于特定数据库错误的信息。

+1

它的工作原理!谢谢。 – Isuru