iOS之swift中錯誤處理的方式

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

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() ``` 其執行結果如下

2251862-212463f4186f807c.jpg 方式二:do-catch

通過do-catch來處理JSON解析的錯誤 var t = CJLTeacher() do{ try t.jsonMap() }catch{ print(error) } 執行結果如下

2251862-cc099bf38b21083d.jpg

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) } ``` 執行結果如下

2251862-92e7ef426558fb23.jpg

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) } ``` 執行結果如下

2251862-632a8e4ebe06f086.jpg