Swift错误处理– Swift尝试,捕捉,抛出
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!
Swift
try
是处理可能引发错误的函数的最基本方法。try?用于通过将错误转换为可选值来处理错误。
这样,如果发生错误,该函数将返回nil并且我们知道Optionals在Swift中可以为nil。
因此,对于"尝试?",您可以摆脱" do-catch"块。" try!"用于断言该错误不会发生。
仅在绝对确定该函数不会引发错误时使用。
就像try?
一样,try!
在没有do-catch块的情况下工作。
var t1 = try? Student(name: nil) var t2 = try! Student(name: "Anupam")