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

前端之家收集整理的这篇文章主要介绍了Swift2.0-异常处理(Exception handler)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


前言

关于我们为什么要使用异常处理,请看百度百科为我们作出的描述,想要更详细的资料请点这里

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

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

以上摘自百度百科:

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

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

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

Demo

你可以在github上下载这个示例Demo

构建异常类型

我们可以构建自己的异常类型,它只是一个枚举,遵循ErrorType,像是这样

enum@H_404_12@ MyErrorHandling: ErrorType {

    case@H_404_12@ error1
    case@H_404_12@ error2

}

定义函数可抛出异常

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

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

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

捕获/处理异常

我们使用do-try-catch获取并处理异常

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

如果只包含一个catch语句,那么所有的错误都会在这个catch中执行,我们能够捕抓其错误信息

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

我们在使用catch时,它是能够进行模式匹配的,我们能够进行更精准的错误匹配处理

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

如果我们不需要捕抓错误,那么我们可以使用try!try?去执行该函数

try@H_404_12@? myLoad(nil@H_404_12@)

不建议使用try!,使用try?会更加安全。因为如果当有错误捕抓到时,程序会直接崩溃

Defer(延迟执行)

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

func myLoad(item@H_404_12@: String?) throws ->@H_404_12@ String {
    defer {
        print@H_404_12@("Handle 1"@H_404_12@)
    }

    defer {
        print@H_404_12@("Handle 2"@H_404_12@)
    }

    guard let@H_404_12@ newItem = item else@H_404_12@ {
        throw@H_404_12@ MyErrorHandling.error1
    }

    return@H_404_12@ newItem
}

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

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


声明

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

猜你在找的Swift相关文章