Swift学习-Error

主要学习如何抛出异常,捕获异常;

1.抛出异常

首先我们定义一个错误枚举。

enum UserDetialError : Error{
    case noVaildName
    case noVaildAge
}

1.1.函数抛出异常写法:

如果函数或初始值设定项可以抛出错误,则必须将throws修饰符添加到定义本身中,就在()之后、返回类型之前。
具体形式如下:

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

}

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

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

2.guard let

在错误处理中,guard let非常有用,因为我们可以用抛出错误替换else块中的return语句。这样可以防止出现过多的if-else情况。

func userTest(age:Int,name:String) throws{
    guard age > 0 else {
        throw UserDetialError.noVaildAge
    }
    guard name.count > 0 else {
        throw UserDetialError.noVaildName
    }
}

3.try do-catch

do{
    try userTest(age:-1,name:"")
}catch let error{
    print("Error:(error)")
}
//打印结果:Error:noVaildAge

我们还可以这么实现

do{
    try userTest(age:-1,name:"")
}catch UserDetialError.noVaildName{
    print("The name isn't valid")
}catch UserDetialError.noVaildAge{
    print("The age isn't valid")
}catch let error{
    print("Unspecified Error:(error)")
}

4.初始化抛出异常

enum StudentError:Error{
    case invaild(String)
    case tooShort
}
class Student{
    var name : String?
    init(name:String?) throws{
        guard let name = name else {
            throw StudentError.invaild("Invalid")
        }
        self.name = name
    }
    func myName(str:String) throws -> String{
        guard str.count > 5 else {
            throw StudentError.tooShort
        }
        return "My name is (str)"
    }
}

此时,我们初始化方法不能按照原来的方式,需要实现do try catch

do{
    var s = try Student(name : nil)
}catch let error{
    print(error)
}
//打印结果:invaild("Invalid")

5.try,try?,try!

try:是处理可能抛出错误的函数的最基本方法。
try?:用于通过将错误转换为可选值来处理错误。这样,如果发生错误,函数将返回nil,并且已知的选项在Swift中可以是nil。
try!:用于断言不会发生错误。仅当确认函数绝对不会发生错误时使用。
try?、try!可以在没有do-catch块的情况下工作。

var t1 = try? Student(name:nil)
var t2 = try! Student(name:"Anupam")
原文地址:https://www.cnblogs.com/PotatoToEgg/p/15039447.html