2017-02-26 58 views
1

我在我的應用程序中使用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到達。

我該如何做到這一點?

回答

1

您的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