主要学习如何抛出异常,捕获异常;
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")