Swift語法-Error Handling 例外處理
一.定義例外
Swift 定義了一個叫 Error
的 protocol,想在程式裡表達的錯誤都由遵從 Error protocol
的型別來定義錯誤。因此可用 class
,struct
或 enum
定義錯誤的型別,只要它實現 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會直接閃退
