本文要解决的问题:
● 错误常用的协议有哪些
● 如何抛出错误
● 如何捕获错误
1.错误常用的协议有哪些
● 抛出错误时,错误需要遵守自 Error 协议。
● 如果需要给错误设置描述信息,则需要遵守LocalizedError协议
● 如果需要给错误设置 errorDomain、errorCode、errorUserInfo信息,则需要遵守CustomNSError协议
// 错误的基础协议
public protocol Error {}
// 有详细的错误信息的协议
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 }
}
// 有自定义的错误信息的协议
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 }
}
2.如何抛出错误
写个例子来演示如何抛出错误。
我们先定义一个错误的枚举:
enum JSONMapError: Error{
case emptyKey
case notConformProtocol
}
extension JSONMapError: LocalizedError{
var errorDescription: String?{
switch self {
case .emptyKey:
return "emptyKey"
case .notConformProtocol:
return "notConformProtocol"
}
}
}
extension JSONMapError: CustomNSError{
var errorCode: Int{
return -10001
}
}
再写一个需要抛错的情况, 使用 throw 关键字将 Error 类型的错误抛出:
func test(description: NSString?) {
if description == nil {
throw JSONMapError.emptyKey
} else {
print("desc: \(String(describing: description))")
}
}
但是这时,编译器报错了:
swift-error
使用了 throw , 方法就必须使用声明成 throws 来接受错误。像下面这样:
swift-error3.如何捕获错误
现在我们来使用上面的 test() 方法
swift-error
编译器建议3中处理方式:
try
返回值是一个非可选项,如果发生错误,会向上传播,就需要由当前所在的作用域来处理,有以下处理方式:
● 可以选择继续抛出错误
● 可以选择使用do-catch 捕获异常
● 不处理,有异常则崩溃
// 1. 继续抛出错误
func test1() throws {
try test(description: nil)
}
// 2. 捕获错误
func test2() {
do {
try test(description: nil)
} catch {
let err = error as? CustomNSError
print(err?.localizedDescription ?? "") // 遵守了LocalizedError协议
print(err?.errorCode ?? "") // 遵守了CustomNSError
}
// 分情况多次catch
do {
try test(description: nil)
} catch let JSONMapError.emptyKey {
print("---")
} catch let JSONMapError.notConformProtocol {
print("---22")
}
}
// 3. 不处理
let result = try test(description: nil)
swift-error
try?
● 如果有错误,就返回nil;
● 没错误则正常执行。
● 不向上传播. 不用上一层再进行错误处理
try!
● 确认不会有异常时,可以使用try! .
● 不向上传播. 不用上一层再进行错误处理
● 不过如果发生了异常,就会崩溃.
青山不改,绿水长流,后会有期,感谢每一位佳人的支持!
网友评论