Swift語法-Error Handling 例外處理

一.定義例外

Swift 定義了一個叫 Error 的 protocol,想在程式裡表達的錯誤都由遵從 Error protocol 的型別來定義錯誤。因此可用 classstructenum 定義錯誤的型別,只要它實現 Error protocol。一般常用 enum 來定義。

利用enum實現Error protocol,並以case列出所有錯誤

enum OperationError:Error {
    case div0Problem//除0錯誤
    case notNumProblem//非數字錯誤
}

二.在function中拋出例外

當 function 裡的程式碼有可能丟出錯誤時,這個 function 必須加上 throws,加在()後,->前,警告大家他很危險,有可能丟出錯誤。並在程式碼需要拋出例外的地方用throw拋出例外,一旦在 function 裡拋出錯誤,就會離開 function,不會再執行接下來的程式碼

 override func operation()throws -> Double {
        if(num20){
            throw OperationError.div0Problem;
        }
        return num1/num2;
    }

三.呼叫函式

呼叫的 function 有可能丟出錯誤時,必須補上 try 才能呼叫。

try operation?.operation()

四.例外發生時的處理方法

1.將例外再度拋出

呼叫該會拋出例外的方法時,呼叫的function也加上throws,當function內的方法出現拋出例外時,呼叫的function會將例外接住並在拋至上一層。

class OperationDiv:Operation{
    override func operation()throws -> Double {
        if(num2  0){
            throw OperationError.div0Problem;
        }
        return num1/num2;
    }
    func test()throws{//例外發生時將例外再度拋出,讓呼叫者處理
        try operation();
    }
}

2.使用do/catch處理例外

利用do/catch裡的catch接住例外,可在catch後方加上指定的例外類型,什麼都不加時為所有例外都接。只要catch到一次例外後,會執行catch中程式碼,執行完後會跳出do/catch。而因為function寫了throws所以swift知道function會拋出例外,所以就算知道所有例外的種類並一一寫了catch,還是必須寫上不指定例外的catch讓swift確定可以接住所有例外。

do {
    try operation?.operation()
}
catch OperationError.div0Problem {
        print("除數不得為0")
}
catch {//必須要有不限制錯誤的catch
    print("例外")
}

3.使用例外發生時會回傳 nil 的try?

不需要包在do/catch中就可以使用。
*缺點是不能夠指定例外的種類。
*使用時機為不想知道例外種類或是不處理錯誤時使用

if((try? operation?.operation()) == nil){
    print("除數不得為0")
}

4.使用try!強制執行

***當例外發生時app會直接閃退