对于包装错误,LocalizedError.errorDescription会丢失

时间:2017-12-20 18:05:45

标签: swift error-handling

在我的Swift应用程序中优化错误处理时,我遇到了以下奇怪的行为。我的自定义错误类型实现了LocalizedError,因此我可以向用户提供errorDescription。由于我不能依赖第三方库来执行相同操作,因此我只有一个ErrorWrapper枚举case underlying(_: Error)

import Foundation

enum CustomError: Error {
    case test(_: String)
}

extension CustomError: LocalizedError {
    var errorDescription: String {
        switch self {
        case let .test(err):
            return "An error occured: \(err)"
        }
    }
}

enum ErrorWrapper: Error {
    case underlying(_: Error)
}

extension ErrorWrapper: LocalizedError {
    var errorDescription: String {
        switch self {
        case let .underlying(error) where error is LocalizedError:
            // I verified execution jumps into this block, 
            // but error.errorDescription is nil
            return (error as! LocalizedError).errorDescription ?? "Unknown error"
        case let .underlying(error):
            return error.localizedDescription
        }
    }
}

let err = CustomError.test("Foo")
let wrapped = ErrorWrapper.underlying(err)

print(err.errorDescription)     // prints: "An error occured: Foo\n"
print(wrapped.errorDescription) // prints: "Unknown error\n"

有没有办法解决这个问题?我考虑过实现我的自定义错误协议,但是如果可能的话,我想坚持使用Swift的内置错误协议。

0 个答案:

没有答案