Swift2.0-异常处理(Exception handler)

Swift2.0-异常处理(Exception handler)


前言

关于咱们为何要使用异常处理,请看百度百科为咱们做出的描述,想要更详细的资料请点这里git

异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优点。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码加强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常状况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操做,处理失败,以及在过后清理资源。
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常情况(即超出程序正常执行流程的某些特殊条件)。

它有功能强大的控制流语句,像`do`、`try`、`catch`、`guard`和`defer`。咱们可以使用这些关键字去操控咱们的代码,更精确地执行咱们的代码。

以上摘自百度百科:github

关联,在Objective-C中,异常处理通常都是使用NSError类接收异常和抛出异常,使用方法像这样编程

NSError *error = nil;
NSString *string = [[NSString alloc] initWithContentsOfFile:@"filePath" encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
    // Exception handle
    NSLog(@"Erorr is %@", error);
}
// Code...

不得不说,Swift的异常处理更为优雅,下面会重点介绍。swift

Demo

你能够在github上下载这个示例Demo安全

构建异常类型

咱们能够构建本身的异常类型,它只是一个枚举,遵循ErrorType,像是这样编程语言

enum MyErrorHandling: ErrorType {
    
    case error1
    case error2
    
}

定义函数可抛出异常

这里值得一提的是,只有函数才可以抛出异常。咱们须要在参数后和返回值前加上throws关键字,并用guard捕捉异常,用throw抛出异常。函数

func myLoad(item: String?) throws -> String {
    guard let newItem = item else {
        throw MyErrorHandling.error1
    }
    return newItem
}

guard: guard必须与else配合使用,只有当guard审查的条件成立,guard以后的代码才会执行,不然抛出异常。url

捕获/处理异常

咱们使用do-try-catch去获取并处理异常code

do {
    try myLoad(nil)
} catch {
    print("error")
}

若是只包含一个catch语句,那么全部的错误都会在这个catch中执行,咱们可以捕抓其错误信息blog

do {
    try myLoad(nil)
} catch let error as NSError {
    print(error)
}

咱们在使用catch时,它是可以进行模式匹配的,咱们可以进行更精准的错误匹配处理

do {
    try myLoad("test")
} catch MyErrorHandling.error1 {
    print("error1")
} catch MyErrorHandling.error2 {
    print("error2")
}

若是咱们不须要捕抓错误,那么咱们可使用try!try?去执行该函数

try? myLoad(nil)

不建议使用try!,使用try?会更加安全。由于若是当有错误捕抓到时,程序会直接崩溃

Defer(延迟执行)

那么咱们什么时候须要使用到defer?这里使用官方的例子,好比咱们须要读取某文件内容并处理,你须要打开这个文件,最后你须要关闭这个文件。当一切顺利的时候,程序一直往下运行,文件也将会被关闭。那么当中间出现一些错误呢?例如在某个环节执行失败了,可是你依然是须要去关闭该文件,在此defer就表现得很强大了。在这个例子中,咱们能够把关闭文件的代码放到defer里面,在defer里的代码不管是函数执行成功或失败都会被执行。

func myLoad(item: String?) throws -> String {
    defer {
        print("Handle 1")
    }
    
    defer {
        print("Handle 2")
    }
    
    guard let newItem = item else {
        throw MyErrorHandling.error1
    }
    
    return newItem
}

须要注意的是,defer语句能够有多个,它们的执行顺序是Handle 1 -> Handle 2。不难理解,它们的执行顺序是先进后出的。

这里再说一下,你能够在github上下载这个示例Demo


声明

博文做者:GarveyCalvin
博文出处:http://www.cnblogs.com/GarveyCalvin/ 本文版权归做者和博客园共有,欢迎转载,但须保留此段声明,并给出原文连接,谢谢合做!

相关文章
相关标签/搜索