以下要点,有在代码对应的注释编号。
1.方法上增加throws,会影响方法签名,如果该方法是实现接口的,throws会使得它不满足接口
2.方法内含有throw语句,必须在声明上加throws
3.不写最后通用的catch会认为错误没有处理完毕,还是需要在在方法声明上加throws
4:异常定义枚举项可以含有参数,并指定参数名
5.显而易见:异常发生之后的代码不会被执行
6.同理,哪怕是defer块,写在异常之后也不会被执行
7.defer块相当于java的finally块,但是得在异常发生之前写,触发时机是当前{}代码块被跳出时执行
8.方法内部没有异常也可以声明上加throws,但是调用它的地方就要try or try? or try!
protocol StudySubject {
func runTest()
}
//定义一个错误类枚举
enum TestErr:Error {
case OneErr
case TwoErr(String)
case ThreeErr(msg:String,code:Int)//###4:可以含有参数,并指定参数名
}
class Cat001A_Basic : StudySubject {
//###2:含有throw语句,必须在函数声明上加throws
func testErr() throws -> Int {
throw TestErr.ThreeErr(msg:"mock error", code: 100)
}
func showMsg(_ msg:String) throws { //###8:可以强行加throws 但是调用的地方就要try or try? or try!
print(msg)
}
//###1:写做 func runTest() throws 会认为没有实现接口,所以throws会影响接口实现
func runTest() {
do {
defer{
try! showMsg("延迟打印-会执行到")//###7:在defer块中相当于finally块,但是得在异常发生之前写,触发时机是当前{}代码块被跳出时执行
}
print("do-catch 错误捕获")
try testErr()
print("未捕获错误") //###5:这行不会被执行
defer{
print("延迟打印-不会执行到")//###6:defer写在异常之后不会被执行
}
} catch TestErr.OneErr {
print("Error@One")
} catch TestErr.TwoErr {
print("Error@Two")
} catch TestErr.ThreeErr(let errObj){
print(type(of:errObj) )
print("Error@Three" + "," + errObj.msg + "," + String(errObj.code))
}
//###3:不写最后这个catch会认为错误没有处理完毕,还是需要在在方法声明上加throws,
//当然这样做也不行,违反了###2
catch{
print("Error@Other")
}
}
}
网友评论