swift —— 错误处理

你可以使用任何实现了 "Error" 协议的类型,来描述错误。例:


swift —— 错误处理_第1张图片
Error

使用 "throw" 关键字来抛出一个错误,使用 "throws"来标明一个函数可以抛出一个错误。如果你在一个函数中,抛出了一个错误,函数立刻返回并且调用这个函数的代码处理这个错误。例:


swift —— 错误处理_第2张图片
throw

有几个处理错误的方法。一个方法是使用do-catch。在"do"的block中,你在可能抛出错误的代码前加上 "try" 来标明。在"catch"的block中,错误自动被命名为"error",除非你手动给予一个别的名称。例:


swift —— 错误处理_第3张图片
do-catch

你可以提供多个 "catch"的block来处理特定的错误。就像在 switch中,你在case后写上条件(范式) ,在catch后写一个条件(范式),来区分不同的错误。例:


swift —— 错误处理_第4张图片
several catch

另一种处理错误的方法是使用 "try?" 来将一个可选类型的结果进行转换。如果函数抛出一个错误,它的返回值将会是空,一个特定的错误将会作为替代(简单来说,就是原本应有的返回值是空的,取而代之的是返回一个错误)。否则,函数返回的,是一个包含了其返回值的可选类型的值(这里就需要拆包了)。例:


swift —— 错误处理_第5张图片
try?

这里 try 和 ? 间不能有空格。try?先运行函数,如果代码没有抛出错误,那么try?的结果就是函数的返回值,不然try?的结果是nil。之所以是nil,而不是error,原因是error是函数抛出的,意味着函数并没有return任何东西。?表示的,是尝试运行的函数,有或者没有返回值。

使用 defer 来写一个block,这个block在函数所有代码之后,函数返回前执行(也就是说,不管你把block放在哪里,他都会在return前面执行)。不论函数是否抛出错误,这段block代码都会执行。你可以使用 defer 来把创建代码(setup code)和清理代码(cleanup code)写在一块儿,即便他们要在不同的时间执行。例:


swift —— 错误处理_第6张图片
defer

你可能感兴趣的:(swift —— 错误处理)