什么是ErrorType?为什么要使用它?

在Objective-C时代,处理错误的最常见方法是使用NSError实例。 一个可能失败的方法通常需要一个指向空NSError实例的指针,这样它才能在执行失败时以及返回时返回特定的错误信息。 然后,您将必须检查错误实例是否仍然为空。

然后使用erorr详细信息放在其userInfoNSDictionary )中,使用它们的代码NSInteger )和NSString )区分这些NSError实例。

这种方法对许多Objective-C开发人员都有效,但存在一些问题。 首先,检查错误很容易被忽略/遗忘。 其次,开发人员可以选择不传递错误指针。 两者都可能导致不良行为,并且在最坏的情况下,还会导致应用崩溃。 此方法仍在Swift 1.x中使用。

处理错误的另一种方法是使用异常。 引发异常时,执行将暂停,并且堆栈跟踪会立即暴露出来或应用程序崩溃。 异常在运行时得到解决,这意味着当您与它们面对面时,您只会知道它们的存在。

引入ErrorType

Swift 2.0中引入了ErrorType协议,该协议为开发人员提供了另一种错误处理流程。 许多数据类型都可以符合ErrorType协议,包括structclass ,但是使用最广泛且可能是最理想的数据类型是enum

由于列举了这些错误,因此无需使用幻数就可以更容易地对其进行分类。 使用Swift强大的enum数据类型,也很容易通过错误传递值以提供更多上下文。 NSError符合ErrorType,但是从ErrorType转换为NSError会丢失几乎所有信息。

投掷

可能引发错误的方法用throws关键字标记。 抛出的对象必须符合ErrorType协议。

Cocoa和CocoaTouch初始值设定项现在使用抛出,而不是使用ErrorPointer导致失败( 初始化? )。 我们上面使用的示例的方法签名现已更改。

赶上试试

捕获模式现在是Swift中错误处理的核心。 现在要求将可能失败的方法放入do-catch块中。 调用这些方法需要在调用它们之前立即用try标记它们。

使用CustomErrormethodThatMayFail()示例,调用用法如下所示。

当标有try的方法失败时,代码将立即进入相应的catch块。 请注意,在上面的示例中,可以使用简单的let语句检索通过CustomError放大的值。 开发人员被迫处理错误,从而导致更好的代码输出。 就像上面的示例一样,所有自定义案例都用通用捕获来处理所有其他错误。 请注意,不可能用尽所有ErrorType情况,因为任何抛出方法都可以抛出任何符合ErrorType的错误,因此总有必要进行通用捕获

还有其他方法可以调用失败的方法而不将它们放入do-catch块中,这是通过使用try标记它们 还是尝试?

您只能使用try! 当您完全确定该方法不会失败时。 如果这样做,您可能会因为崩溃而使应用程序崩溃。 此模式也可以用来捕获开发人员错误。

你可以试试看吗? 如果您调用的方法在方法操作中没有失败的情况下返回seomthing,否则将仅返回nil值。

推迟

最后,将代码放在defer块中将意味着它将在退出当前作用域之后执行,无论是否捕获到错误。

学分

  • Swift 2.0中的错误处理 大书呆子牧场
  • 测试Swift的ErrorType:探索 领域
  • Swift 2中的错误处理:尝试,捕捉,执行和抛出| 用Swift入侵

Interesting Posts