【问题标题】:Custom Error Handler not returning Error as expected自定义错误处理程序未按预期返回错误
【发布时间】:2020-03-17 22:34:00
【问题描述】:

我们有一组自定义服务器消息,我们会根据设备的语言进行更改。 函数正在返回

(Error Domain=Proyect.ErrorHandler.DatabaseErrors Code=11 "(null)") 而不是

(Error Domain=ourwebpage Code=11 "Text we have in Localizable.strings")

class ErrorHandler {

    public enum DatabaseErrors: Error {
        case ok
        case incorrectFormat
        case userHasNoRights
        case doesntExists
        case authError
        case serverError
        case missingData
        case alreadyRegistered
        case loadError
        case inactive
        case updateRequired
        case incorrectData
        case databaseError

        private var domain: String {
            return "ourwebpage"
        }

        private var errorCode: Int {
            switch self {
                case .ok:
                    return 0
                case .incorrectFormat:
                    return 1
                case .userHasNoRights:
                    return 2
                case .doesntExists:
                    return 3
                case .authError:
                    return 4
                case .serverError:
                    return 5
                case .missingData:
                    return 6
                case .alreadyRegistered:
                    return 7
                case .loadError:
                    return 8
                case .inactive:
                    return 9
                case .updateRequired:
                    return 11
                case .incorrectData:
                    return 12
                case .databaseError:
                    return 13

            }
        }

        var description: String {
            switch self {
                case .ok:
                    return NSLocalizedString("server_message_00", comment: "")
                case .incorrectFormat:
                    return NSLocalizedString("server_message_01", comment: "")
                case .userHasNoRights:
                    return NSLocalizedString("server_message_02", comment: "")
                case .doesntExists:
                    return NSLocalizedString("server_message_03", comment: "")
                case .authError:
                    return NSLocalizedString("server_message_04", comment: "")
                case .serverError:
                    return NSLocalizedString("server_message_05", comment: "")
                case .missingData:
                    return NSLocalizedString("server_message_06", comment: "")
                case .alreadyRegistered:
                    return NSLocalizedString("server_message_07", comment: "")
                case .loadError:
                    return NSLocalizedString("server_message_08", comment: "")
                case .inactive:
                    return NSLocalizedString("server_message_09", comment: "")
                case .updateRequired:
                    return NSLocalizedString("server_message_11", comment: "")
                case .incorrectData:
                    return NSLocalizedString("server_message_12", comment: "")
                case .databaseError:
                    return NSLocalizedString("server_message_13", comment: "")
            }
        }

        var foundationError: NSError {
            return NSError(domain: domain, code: errorCode, userInfo: [NSLocalizedDescriptionKey: description])
        }
    }

我们调用这个函数,比如 ErrorHandler.checkErrorCode(customCode) 来发送我们在 completionHandler 中的自定义代码,比如 completionHandler(nil, ErrorHandler.checkErrorCode(customCode) as NSError)

    static func checkErrorCode(_ errorCode: Int) -> DatabaseErrors{
        switch errorCode {
            case 0:
                return .ok
            case 1:
                return .incorrectFormat
            case 2:
                return .userHasNoRights
            case 3:
                return .doesntExists
            case 4:
                return .authError
            case 5:
                return .serverError
            case 6:
                return .missingData
            case 7:
                return .alreadyRegistered
            case 8:
                return .loadError
            case 9:
                return .inactive
            case 11:
                return .updateRequired
            case 12:
                return .incorrectData
            case 13:
                return .databaseError
            default:
                return .ok
        }
    }

}

我尝试将.foundationError 添加到案例中,但我得到了Type of expression is ambiguous without more context。我关注了this 和这个

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您的代码具有史诗般的DRY抗性!

    首先你真的需要重构它:

    class ErrorHandler {
    
        public enum DatabaseErrors: Int, Error {
            case ok
            case incorrectFormat
            case userHasNoRights
            case doesNotExists
            case authError
            case serverError
            case missingData
            case alreadyRegistered
            case loadError
            case inactive
            case updateRequired
            case incorrectData
            case databaseError
    
            private var domain: String { "ourwebpage" }
            private var errorCode: Int { rawValue }
    
            var description: String { NSLocalizedString(String(format: "server_message_%.2d", errorCode), comment: "") }
            var foundationError: NSError { NSError(domain: domain, code: errorCode, userInfo: [NSLocalizedDescriptionKey: description]) }
        }
    }
    

    所以现在静态函数是:

    static func checkErrorCode(_ errorCode: Int) -> DatabaseErrors { DatabaseErrors(rawValue: errorCode) ?? .ok }
    

    就是这样! 124 行代码减少到只有 24 行,现在您可以添加任何您想要的大小写,而不会产生任何歧义。

    【讨论】:

    • 当我打印 error.domain 时,它仍然显示 Proyect.ErrorHandler.DatabaseErrors 而不是 ourwebpage,它仍然没有描述或 userInfo
    • 好吧,我的错,问题是我再次将其转换为 NSError
    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2017-12-18
    • 2018-09-10
    • 2018-04-29
    • 2011-06-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多