iOS之swift中錯誤處理的方式
小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。
swift中錯誤處理的方式主要有以下兩種:
- 【方式一】 :使用try關鍵字
,是最簡便的,即甩鍋,將這個丟擲給別人(向上丟擲,拋給上層函式)。但是在使用時,需要注意以下兩點:
- try?
返回一個可選型別
,只有兩種結果:
- 要麼成功
,返回具體的字典值
- 要麼錯誤
,但並不關心是哪種錯誤,統一返回nil
- try!
表示你對這段程式碼有絕對的自信,這行程式碼絕對不會發生錯誤
- 【方式二】 :使用do...catch
【方式一】try
通過try
來處理JSON解析的錯誤
```
//CJLTeacher中定義一個height屬性,並未遵守協議
class CJLTeacher: CustomJSONMap {
var age = 18
var name = "CJL"
var height = 1.85
}
/*1、try? 示例***/ var t = CJLTeacher() print(try? t.jsonMap())
/*列印結果***/ nil
/*2、try! 示例***/ var t = CJLTeacher() print(try! t.jsonMap())
/*列印結果***/ Fatal error: 'try!' expression unexpectedly raised an error: _5_MirrorAndError.JSONMapError.notConformProtocol: file _5_MirrorAndError/main.swift, line 90 2020-12-20 18:27:28.305112+0800 05-MirrorAndError[18642:1408258] Fatal error: 'try!' expression unexpectedly raised an error: _5_MirrorAndError.JSONMapError.notConformProtocol: file _5_MirrorAndError/main.swift, line 90
var t = CJLTeacher() try t.jsonMap()
/*列印結果***/
Fatal error: Error raised at top level: _5_MirrorAndError.JSONMapError.notConformProtocol: file Swift/ErrorType.swift, line 200
2020-12-20 18:31:24.837476+0800 05-MirrorAndError[18662:1410970] Fatal error: Error raised at top level: _5_MirrorAndError.JSONMapError.notConformProtocol: file Swift/ErrorType.swift, line 200
從上面可以知道,錯誤是向上丟擲的,即拋給了上層函式,如果上層函式也不處理,則直接拋給main,main沒有辦法處理,則直接報錯,例如下面的例子
//使用
var t = CJLTeacher()
func test() throws -> Any{ try t.jsonMap() } try test() ``` 其執行結果如下
方式二:do-catch
通過do-catch
來處理JSON解析的錯誤
var t = CJLTeacher()
do{
try t.jsonMap()
}catch{
print(error)
}
執行結果如下
LocalError協議
如果只是用Error還不足以表達更詳盡的錯誤資訊,可以使用LocalizedError
協議,其定義如下
```
public protocol LocalizedError : Error {
/// A localized message describing what error occurred.錯誤描述
var errorDescription: String? { get }
/// A localized message describing the reason for the failure.失敗原因
var failureReason: String? { get }
/// A localized message describing how one might recover from the failure.建議
var recoverySuggestion: String? { get }
/// A localized message providing "help" text if the user requests help.幫助
var helpAnchor: String? { get }
}
- 繼續修改上面的JSON解析,對`JSONMapError`列舉增加一個擴充套件,遵守`LocalizedError`協議,可以列印更詳細的錯誤資訊
//定義更詳細的錯誤資訊
extension JSONMapError: LocalizedError{
var errorDescription: String?{
switch self {
case .emptyKey:
return "key為空"
case .notConformProtocol:
return "沒有遵守協議"
}
}
}
var t = CJLTeacher() do{ try t.jsonMap() }catch{ print(error.localizedDescription) } ``` 執行結果如下
CustomNSError協議
CustomNSError
相當於OC中的NSError
,其定義如下,有三個預設屬性
```
public protocol CustomNSError : Error {
/// The domain of the error.
static var errorDomain: String { get }
/// The error code within the given domain.
var errorCode: Int { get }
/// The user-info dictionary.
var errorUserInfo: [String : Any] { get }
}
- 繼續修改JSON解析中的`JSONMapError`,讓其遵守`CustomNSError`協議,如下所示
//CustomNSError相當於NSError
extension JSONMapError: CustomNSError{
var errorCode: Int{
switch self {
case .emptyKey:
return 404
case .notConformProtocol:
return 504
}
}
}
var t = CJLTeacher() do{ try t.jsonMap() }catch{ print((error as? JSONMapError)?.errorCode) } ``` 執行結果如下