如何实现通用 do-try-catch 块以捕获操作中引发的所有错误

Posted

技术标签:

【中文标题】如何实现通用 do-try-catch 块以捕获操作中引发的所有错误【英文标题】:How to implement generic do-try-catch block to catch all errors that are thrown on an operation 【发布时间】:2016-11-13 03:53:18 【问题描述】:

在 Swift 3.0 中,如何实现通用的 do-try-catch 块来捕获由于操作而引发的所有错误。 Apple 文档说要实现一个 ErrorType 类型的枚举器,它列出了抛出的错误。假设如果我们不知道一个操作会抛出什么样的错误,那么如何实现它。以下代码仅用于说明目的。在这里我可以捕捉到错误,但我不知道是什么导致了这个错误。在目标 C 中,我们可以得到错误发生的确切原因,但在这里我们只得到我们分配给它的信息。

enum AwfulError: ErrorType
case CannotConvertStringToIntegertype
case general(String)

func ConvertStringToInt( str : String) throws  -> Int

      if (Int(str) != nil) 
          return Int(str)!
      
      else 
          throw  AwfulError.general("Oops something went wrong")
      


let val = "123a"

do  
    let intval: Int = try ConvertStringToInt(val)
    print("int value is : \(intval)")


catch let error as NSError 
    print("Caught error \(error.localizedDescription)")

我找到了问题的解决方案。下面列出了代码结构。

do 
    let str = try NSString(contentsOfFile: "Foo.bar",encoding: NSUTF8StringEncoding)
    print(str)

catch let error as NSError 
    print(error.localizedDescription)

下面的代码不起作用,因为 try 表达式返回 nil 。要抛出错误,try 表达式应该返回错误而不是 nil 值。类型转换操作是可选的。

do 
    let intval  = try Int("123q")
    print( Int("\(intval)"))

catch let error as NSError 
    print(error.localizedDescription)

【问题讨论】:

您可以捕获 ErrorType 其他类型。此答案代码中的示例:***.com/a/31808605/2227743。 (appzyourLife 的回答也有效)。 谢谢埃里克。您的枚举将在您的用例中正常工作,因为您事先知道请求的响应应该有一个 nsdata 并且应该转换为 json。就我而言,我什至不知道操作可能会引发什么错误。我希望它是通用的,可以捕获所有可能的错误。 这只是一个示例,向您展示您可以捕获已定义的错误,符合 ErrorType 的错误,捕获 NSError 的错误,您不知道的错误提前。 :) 如果你愿意,也可以添加一个通用的 catch,比如 appzyourLife 的。 【参考方案1】:

您可以使用catch 来捕获任何类型的错误。

do 
    try foo()
 catch 
    print(error)

【讨论】:

感谢 appzYourLife。你打算如何从 foo() 抛出错误?请注意,我想得到一个通用的响应,为什么操作失败。 @Jinil:函数必须这样定义:func foo() throws ...

以上是关于如何实现通用 do-try-catch 块以捕获操作中引发的所有错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”

如何在 Rust 中将字符串拆分为块以插入空格

《从零开始学Swift》学习笔记(Day 53)——do-try-catch错误处理模式

如何编写块以跳过失败过程

如何连接其中的音量滑块以使用它

如何使用jQuery捕获退格键? [复制]