新的異常捕獲機制更新於 WWDC 2015上發布的新的Swift2.0,異常的try-catch機制有助於我們更快的定位出錯原因所在,此處簡單說明下try-catch機制的用法.
1.定義枚舉異常值
首先我們可以創建自己的異常枚舉值,這要實現ErrorType協議,只不過這個協議是空的,我們加上就好.

2.拋出異常
我們可以在方法中拋出異常,定義拋出異常的方法很簡單,只需要在返回值的 -> 前面加上throws就好了,示例如下:(這個方法是自定義的Dog類里的一個實例方法,name.length()是為系統的String類通過延展添加的方法)

3.捕獲異常
我們可以在調用可能拋出異常的方法后面加上catch關鍵字來捕獲異常

4.不處理異常
如果確定某段可能拋出異常的代碼是不可能拋出異常的,則可以使用try!來進行調用,但是如果一旦這段代碼拋出了一個異常,則會引起一個運行時的異常錯誤,所以請慎用.
結尾:
值得注意的是,在可能拋出異常的方法中,一但有一處拋出了一個異常,那么這個方法則會立刻停止運行.拋出異常代碼后面的代碼都將不會得到執行
附自定義Dog類和調用Dog類的代碼
enum DogError : ErrorType{
case NameInvalidError
case AgeInvalidError
case NameLengthError
}
class Dog: NSObject {
var name : String!
var age : Int!
init(name:String,age:Int){
self.name = name
self.age = age
}
func printDogMessage(dog:Dog) throws -> String{
print("Dog-Class:開始檢查名字是否無效")
guard let name : String = dog.name else{
throw DogError.NameInvalidError
}
print("Dog-Class:開始檢查名字長度是否無效")
if name.length() < 3{
throw DogError.NameLengthError
}
print("Dog-Class:開始檢查年齡是否無效")
if age < 0 || age > 20{
throw DogError.AgeInvalidError
}
print("Dog-Class:返回信息")
case NameInvalidError
case AgeInvalidError
case NameLengthError
}
class Dog: NSObject {
var name : String!
var age : Int!
init(name:String,age:Int){
self.name = name
self.age = age
}
func printDogMessage(dog:Dog) throws -> String{
print("Dog-Class:開始檢查名字是否無效")
guard let name : String = dog.name else{
throw DogError.NameInvalidError
}
print("Dog-Class:開始檢查名字長度是否無效")
if name.length() < 3{
throw DogError.NameLengthError
}
print("Dog-Class:開始檢查年齡是否無效")
if age < 0 || age > 20{
throw DogError.AgeInvalidError
}
print("Dog-Class:返回信息")
return "dog的信息為" + dog.name + "\(dog.age)"
}
}
測試方法的代碼:
let myDog = Dog(name: "小白", age: 21)
var str : String!
do{
try str = myDog.printDogMessage(myDog)
}
catch {
switch (error){
case DogError.NameInvalidError: print("dog的名字無效錯誤")
case DogError.NameLengthError : print("dog的名字長度錯誤")
case DogError.AgeInvalidError : print("dog的年齡設置不合法")
default:print("Main:捕獲到dog其他錯誤")
}
}
try str = myDog.printDogMessage(myDog)
}
catch {
switch (error){
case DogError.NameInvalidError: print("dog的名字無效錯誤")
case DogError.NameLengthError : print("dog的名字長度錯誤")
case DogError.AgeInvalidError : print("dog的年齡設置不合法")
default:print("Main:捕獲到dog其他錯誤")
}
}
print("Main:最后輸出為\(str)")