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

前言

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

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

以上摘自百度百科:

关联,在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的异常处理更为优雅,下面会重点介绍。

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之后的代码才会执行,否则抛出异常。

捕获/处理异常

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

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

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

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/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

Swift2.0-异常处理(Exception handler)的更多相关文章

  1. Spring Cloud Gateway自定义异常处理Exception Handler

    版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: Er ...

  2. Swift2.0异常处理

    // 在抛出异常之前,我们需要在函数或方法的返回箭头 -> 前使用 throws 来标明将会抛出异常 func myMethodRetrunString() throws -> Strin ...

  3. 总结swift 1.2适配swift2.0遇到的改变

    swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sor ...

  4. 异常处理—Exception(二)

    在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...

  5. java异常处理Exception

    我看别人的面经中有一道题目就问到了Exception,即java的异常处理的,我曾经也学了java的异常处理,可是我查了下,看了别人的博客关于写的exception异常处理.我发现,自己学的不坚固,仅 ...

  6. (IOS)Swift2.0 Radio 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源项目Swift Radio的研究心得. 项目地址:https://github.com/swiftcodex/Swift-Rad ...

  7. [Swift2.0系列]Defer/Guard 基础语法

    1.Defer Swift2.0中加入了defer新语法声明.defer译为延缓.推迟之意.那么在Swift2.0中它将被应用于什么位置呢?比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件 ...

  8. Swift2.0 中的String(三):类型转换

    本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...

  9. Swift2.0 中的String(二):基本操作

    Swift中的字符串,第二篇,基本操作.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一) ...

随机推荐

  1. HDU 5298 Solid Geometry Homework 暴力

    Solid Geometry Homework 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5298 Description Yellowstar ...

  2. 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

    邱老师降临小行星 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

  3. Ubuntu 16.04安装uafred用于替代Alfred

    说明: Macx下的Alfred非常强大,在Ubuntu下的替代为uafred,为什么选择uafred而不选择其它在于其功能开发简单,模块集成方便,不像别的实现是那种来回封装调用,其实就是一个功能而已 ...

  4. ios常用的字符串NSString自动释放理解

    最近在做程序的时候,突然发现对于NSString的理解还是存在问题的.因此补充一片blog,希望对刚刚进入OC开发并搞不清楚内存泄露问题的人一点指引. 赋值: NSString * str = @&q ...

  5. Process ID, Process handle, Window handle

    http://forums.codeguru.com/showthread.php?392273-RESOLVED-How-to-get-window-s-HWND-from-it-s-process ...

  6. Druid 配置_配置WebStatFilter

    https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter WebStatFilt ...

  7. system.data.sqlite.dll

    记录下最新的system.data.sqlite.dll下载地址和官网:http://system.data.sqlite.org

  8. Silverlight:《Pro Silverlight5》读书笔记 之 Dependency Properties And Routed Event

    Dependency Properties And Routed Event Dependency Properties Dynamic Value Resolution As you’ve alre ...

  9. 关于textiled的设置透明度的问题

    如果textfield的背景色设置的是黑色的话, 然后设置它的透明度为0.3, 就会显示出半透明的效果, 这时如果用键盘输入时, 会显示不出来输入的字体. 因为: textfield的字体默认也是黑色 ...

  10. udp_client.c udp_server.c

    #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> ...