【问题标题】:Handling errors in swift with try/catch使用 try/catch 快速处理错误
【发布时间】:2016-12-11 18:01:24
【问题描述】:

我来自 .NET 背景,其中错误处理可以像在 try-catch 中包装一组语句一样简单。例如:

try
{
   statement1
   statement2
}
catch (ex)
{
   log(ex.Message)
}

我正在尝试在我的 Swift 项目中添加错误处理,到目前为止我阅读的所有文章似乎都表明错误处理需要在 Swift 中进行更多工作。在上面的示例中,似乎我需要确切知道哪个语句引发了错误,然后在它之前添加一个“try”。是否不可能简单地将代码块包装在 try-catch 中,并检查引发的错误?

【问题讨论】:

  • 是的,没错。
  • 哇,看起来工作量很大。我的应用程序崩溃了,我想做的只是围绕可疑代码添加一个简单的 try/catch 并进行一些日志记录,但似乎我需要做很多异常设计工作才能做到这一点!
  • 要检查抛出的错误,设置an exception breakpoint
  • 要求开发人员知道他们试图从哪些函数中捕获错误真的有那么不合理吗?

标签: swift exception exception-handling swift2


【解决方案1】:

不,你不能只用 try-catch 包装一段代码。

首先,不是每一行代码都会产生异常。只有标记为“抛出”的函数才会产生异常。

例如,你有一些功能:

deserialise(json: JSON) -> MyObjectType throws

并让这个函数抛出 MyErrorType

类型的异常

这就是你应该如何使用它:

....
do {
  let deserialisedObject = try deserialise(jsonObject)
  ... // do whatever you want with deserialised object here
} catch let error as MyErrorType {
  ... // do whatever you want with error here
}
...

因此,如您所见,swift 中的异常与 .NET 的 C++(或其他常规语言)中的异常不同

【讨论】:

    【解决方案2】:

    您可以像在 .net 中一样在 swift 中使用 try catch,只需稍稍改变结构即可, 在此之前创建一个您想要捕获的异常枚举,如下所示

    //exceptions to catch, change as per your need
    enum someActionError: Error {
        case invalidSelection
        case outOfStock
    }
    
    //use
    do {
        try statement1
    } catch someActionError.invalidSelection {
        print("Invalid Selection.")
    } catch someActionError.outOfStock {
        print("Out of Stock.")
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2022-01-24
      • 2012-04-20
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多