Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 529|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-8-28 11:20:17 | 显示全部楼层 |阅读模式

    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/
    本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-28 09:09 , Processed in 0.075316 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表