自定义错误类型初始化器

鲍尔音乐

让我在前面加上为什么我认为这与“如何在Swift中提供带有错误类型的本地化描述”不重复的原因开头。

提供的答案仍将导致某些静态/类函数调用,而不是初始化器样式,或者需要强制转换为NSError(我想避免)。


简要总结一下原因:

throws没有声明错误类型的Swift函数我们不能强制catch传递简单符合Error协议的自定义类型知道,在do-catch方面,编译器无法提供有关所得到的错误类型(如果是自定义)的帮助,默认情况下,我们将期望已知的NSError属性。否则,我们只需要依靠文本文档来说明我们可以捕获的错误的类型,因为捕获只会传递一个Error类型。

现在,与NSError不同,Error是一个协议,其中我们获取的属性userInfo是只读的。因此,我们求助于构造一个NSError类型,并将其强制转换为Error。


我正在尝试创建一个简单的干净结构,该结构返回一个Error类型(不是NSError),可以在其中抛出:

throw MYError(domain: "com.somthing.error", code: 0, userInfo: [NSLocalizedDescriptionKey : "Something bad happened"])

主要问题是,设置的唯一方法NSLocalizedDescriptionKey是初始化NSError对象。这样做将需要强制Error类型转换(这是我要避免的事情)。

我首先尝试使用extension Error {...,但无法使用初始化程序。

如果我使用符合错误协议(struct MyError: Error {...)的结构,我仍然会localizedDescription遇到问题

我使用的实际上是这样的:

struct MYError: Error {

    static func with(domain: String = "com.somthing.error", code: Int = 0, localizedDescription: String) -> Error {
        return NSError(domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey : localizedDescription]) as Error
    }
}

我可以这样使用:

throw MYError.with(localizedDescription: "Some Error has happened")

凭直觉,我希望类型MYError只使用一个初始化器MYError(domain:...,而不是静态函数。


更快捷的方式是:

enum ErrorType: Error {
    case one
    case two
    case three(with: String)
}

...

// In some function:
throw ErrorThrown.three(with: "Three!")

...

// Catch like:
catch ErrorType.three(let str) {
    print("Error three: \(str)")
}

尚不清楚我们是否在那里。看来NSError仍然发挥着作用,我知道我可以期望得到一个localizedDescription可选的localizedFailureReason和熟悉的NSError属性。

马丁·R

如何在Swift中提供带有错误类型的本地化描述类似您可以定义采用LocalizedError协议的自定义错误类型

public struct MyError: Error {
    let msg: String

}

extension MyError: LocalizedError {
    public var errorDescription: String? {
            return NSLocalizedString(msg, comment: "")
    }
}

例:

do {
    throw MyError(msg: "Something happened")
} catch let error {
    print(error.localizedDescription)
}

这将打印给定消息的本地化版本。请注意,error在catch子句中是一个general Error,因此调用方不需要将其强制转换为具体的错误类型(甚至不需要知道抛出哪种错误类型)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Go中初始化自定义int类型

开始,初始化自定义类型

最佳做法,如何初始化自定义类型?

如何使用进行错误检查的自定义设置器初始化属性?

重载>>运算符,并使用自定义类型的初始化列表初始化

自定义绑定初始化

在自定义类中初始化日期会导致错误:“实例成员不能在类型上使用”

自定义类型的 Swift 字典初始化给出:“>”不是后缀一元运算符错误

在初始化所有存储的属性之前,由于自身导致的自定义解码器错误

在初始化所有存储的属性之前,由于自身导致的自定义解码器错误

自定义类型需要使用auto进行初始化的初始化程序吗?

初始化结构化文本语法中的自定义类型数组

为SKScene创建一个自定义的初始化器,以覆盖便捷初始化吗?(fileNamed :)

为什么属性初始化器不调用自定义设置器?

我如何正确初始化具有自定义类型的变量

初始化自定义类型不适用于var,但适用于:=

如何使用标准向量初始化自定义向量类型

朱莉娅:制作自定义类型的空/初始化多维数组

自定义初始化程序应使用哪种类型的参数?

如何初始化自定义行类型 Jooq Record

具有依赖项初始化错误的自定义程序包:ModuleNotFoundError或ImportError

致命错误:在自定义NavigationController中使用未实现的初始化程序

Elixir:在websocket初始化上返回自定义错误

自定义数组适配器初始化错误

如何初始化自定义javafx控制器的成员变量?

如何使用自定义比较器初始化 std::set 类数据成员

如何从类本身内部初始化自定义视图控制器?

MFC在执行自定义验证之前初始化日期时间选择器控件

初始化传递给unique_ptr自定义删除器的函子