Swift错误处理– Swift尝试,捕捉,抛出

时间:2020-02-23 14:44:01  来源:igfitidea点击:

Swift错误处理是编写更好的代码的一个非常重要的方面。
Swift try语句用于swift程序中的错误处理。
让我们开始启动XCode游乐场。

Swift错误处理

Swift错误处理就是关于优雅地处理失败情况的一切。

错误可能导致运行时错误或者程序流程更改。

我们在项目中遇到各种错误:

  • 逻辑错误

  • 类型转换错误。

  • 外部错误,例如FileNotFound等。

处理错误的暴力方式是使用if else语句,在该语句中我们检查每个可能的错误。
但这可能会导致嵌套条件过多的膨胀代码。

在Swift中,错误只是某种类型的值。
Swift不支持检查的异常。

Swift错误协议

错误协议只是一种表示可以抛出的错误值的类型。

Swift要求您创建自定义错误类型。
通常,使用符合错误协议的枚举。

错误协议或者多或者少是空的。
因此,您不需要覆盖它们中的任何内容。
错误协议是错误处理和创建错误类型的必要条件。

让我们创建一个符合此错误协议的基本枚举。

enum UserDetailError: Error {
  case noValidName
  case noValidAge
}

现在,在我们的类和函数中使用此错误类型。

throws和throw

如果函数或者初始化程序可能引发错误,则必须在定义本身中的" parathes"之后和返回类型之前添加" throws"修饰符。

func userTest() throws -> <Return Type> {

}

throws关键字会将错误从函数传播到调用代码。
否则,非抛出函数必须处理该函数代码本身内部的错误。

throw关键字用于从定义的错误类型抛出错误。

让我们看一个演示throw和throw in函数的示例:

func userTest() throws {
  if <condition_matches> {
  //Add your function code here
  }
  else{
  throw UserDetailError.noValidName
  }
}

在错误处理中,在让我们可以将thing错误替换为else块中的return语句的意义上,保护让出很有用。
这样可以避免太多其他情况。
让我们以下面的示例来看一下。

func userTest(age: Int, name: String) throws {
  
  guard age > 0 else{
  throw UserDetailError.noValidAge
  }
  
  guard name.count > 0 else{
     throw UserDetailError.noValidName
  }
}

注意:您不能在Swift中的throws关键字之后添加Error类型。

在上面的代码中,如果后卫让位条件失败,则会引发错误,并且函数将自行返回。
让我们看看如何处理这些错误。

Swift try, do-catch

在Swift中,与Java相反,do-catch块用于代替try-catch处理错误。

每个抛出的函数都需要在try语句中进行设置,因为它有潜在的错误。

Swift try语句仅在它位于do-catch块中时才执行,如下所示。

do{
try userTest(age: -1, name: "")
} catch let error {
  print("Error: \(error)")
}

下图显示了以上程序的输出。

或者,我们可以这样做:

do{
try userTest(age: -1, name: "")
}
catch UserDetailError.noValidName
{
  print("The name isn't valid")
}
catch UserDetailError.noValidAge
{
  print("The age isn't valid")
}
catch let error {
  print("Unspecified Error: \(error)")
}

初始化程序中的抛出错误

我们可以通过以下方式在初始化器中添加throws

enum StudentError: Error {
  case invalid(String)
  case tooShort
}

class Student {
  var name: String?
  init(name: String?) throws {
      guard let name = name else{
          throw StudentError.invalid("Invalid")
      }
      self.name = name }

  func myName(str: String) throws -> String {

      guard str.count > 5
          else{
              throw StudentError.tooShort
      }

      return "My name is \(str)"
  }
}

现在初始化类,我们通常执行以下操作,对吗?

var s = Student(name: nil)
//compiler error

由于初始化器引发错误,因此我们需要附加" try"关键字,如下所示。

do{
var s = try Student(name: nil)
}
catch let error
{
  print(error)
}

//prints
//invalid("Invalid")

如下所示,我们也可以在对象上调用class函数。

Swift try, try? and try!

  • Swifttry是处理可能引发错误的函数的最基本方法。

  • try?用于通过将错误转换为可选值来处理错误。
    这样,如果发生错误,该函数将返回nil并且我们知道Optionals在Swift中可以为nil。
    因此,对于"尝试?",您可以摆脱" do-catch"块。

  • " try!"用于断言该错误不会发生。
    仅在绝对确定该函数不会引发错误时使用。
    就像try?一样,try!在没有do-catch块的情况下工作。

var t1 = try? Student(name: nil)
var t2 = try! Student(name: "Anupam")