iOS之swift中错误处理的方式

1,530 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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

<!--3、如果直接使用try,是向上抛出-->
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