当前位置: 首页 > 面试题库 >

Swift语言中的错误处理

傅长恨
2023-03-14
问题内容

我对Swift的了解还不够多,但是我注意到的一件事是没有例外。那么如何在Swift中进行错误处理呢?有没有人发现任何与错误处理相关的信息?


问题答案:

斯威夫特2&3

Swift 2中的情况有所变化,因为有了新的错误处理机制,该机制与异常有些相似,但在细节上有所不同。

1.指示错误可能性

如果函数/方法想要表明它可能抛出错误,则应包含这样的throws关键字

func summonDefaultDragon() throws -> Dragon

注意:函数没有实际抛出的错误类型的规范。 该声明只是声明该函数可以抛出实现ErrorType的任何类型的实例,或者根本不抛出该实例。

2.调用可能引发错误的功能

为了调用函数,您需要使用try关键字,像这样

try summonDefaultDragon()

该行通常应该像这样出现在do-catch块中

do {
    let dragon = try summonDefaultDragon() 
} catch DragonError.dragonIsMissing {
    // Some specific-case error-handling
} catch DragonError.notEnoughMana(let manaRequired) {
    // Other specific-case error-handlng
} catch {
    // Catch all error-handling
}

注意:catch子句使用Swift模式匹配的所有强大功能,因此您在这里非常灵活。

如果您正在从本身用throws关键字标记的函数中调用throwing函数,则可以决定传播错误:

func fulfill(quest: Quest) throws {
    let dragon = try summonDefaultDragon()
    quest.ride(dragon)
}

另外,您可以使用try?以下命令调用throwing函数:

let dragonOrNil = try? summonDefaultDragon()

这样,如果发生任何错误,您将获得返回值或nil。使用这种方式,您不会得到错误对象。

这意味着您还可以结合以下try?有用的语句:

if let dragon = try? summonDefaultDragon()

要么

guard let dragon = try? summonDefaultDragon() else { ... }

最后,您可以确定知道实际上不会发生错误(例如,因为您已经检查过先决条件),并使用try!关键字:

let dragon = try! summonDefaultDragon()

如果该函数实际引发错误,则您的应用程序中将出现运行时错误,并且该应用程序将终止。

3.引发错误

为了抛出错误,您可以使用throw这样的关键字

throw DragonError.dragonIsMissing

您可以抛出任何符合ErrorType协议的内容。对于初学者来说,NSError遵循此协议,但您可能希望使用基于枚举的枚举,ErrorType该枚举使您可以将多个相关的错误归为一组,并可能附加其他数据,例如:

enum DragonError: ErrorType {
    case dragonIsMissing
    case notEnoughMana(requiredMana: Int)
    ...
}

新的Swift 2和3错误机制与Java / C#/ C ++样式异常之间的主要区别如下:

  • 语法是有点不同:do-catch+ try+ deferVS传统的try-catch-finally语法。
  • 异常处理通常会导致异常路径中的执行时间比成功路径中的执行时间长得多。Swift 2.0错误并非如此,成功路径和错误路径的成本大致相同。
  • 必须声明所有错误抛出代码,而异常可能已从任何地方抛出。所有错误都是Java术语中的“检查的异常”。但是,与Java相比,您没有指定可能引发的错误。
  • Swift异常与ObjC异常不兼容。您的do-catch块将不会捕获任何NSException,反之亦然,因为您必须使用ObjC。
  • Swift异常与NSError返回false(对于Bool返回函数)或nil(对于AnyObject返回函数)并传递NSErrorPointer错误详细信息的Cocoa 方法约定兼容。

作为减轻错误处理的额外语法糖,还有两个概念

  • 延迟操作(使用defer关键字),使您可以实现与Java / C#/ etc中的finally块相同的效果
  • 保护语句(使用guard关键字),使您编写的if / else代码比普通的错误检查/信号代码少。

斯威夫特1

运行时错误:

正如Leandros建议处理运行时错误(如网络连接问题,解析数据,打开文件等)一样,您应该NSError像在ObjC中一样使用,因为Foundation,AppKit,UIKit等以这种方式报告错误。因此,与其说是语言,不如说是框架

另一个经常使用的模式是分隔符成功/失败块,例如AFNetworking中:

var sessionManager = AFHTTPSessionManager(baseURL: NSURL(string: "yavin4.yavin.planets"))
sessionManager.HEAD("/api/destoryDeathStar", parameters: xwingSquad,
    success: { (NSURLSessionDataTask) -> Void in
        println("Success")
    },
    failure:{ (NSURLSessionDataTask, NSError) -> Void in
        println("Failure")
    })

故障块仍然是频繁接收的NSError实例,描述了错误。

程序员错误:

对于程序员错误(例如对数组元素的越界访问,传递给函数调用的无效参数等),您在ObjC中使用了异常。雨燕语言似乎并未有任何异常的语言支持(如throwcatch等关键字)。但是,正如文档所示,它与ObjC在同一运行时上运行,因此您仍然可以这样抛出NSExceptions

NSException(name: "SomeName", reason: "SomeReason", userInfo: nil).raise()

尽管您可能选择在ObjC代码中捕获异常,但是您无法在纯Swift中捕获它们。

问题是您是否应该为程序员错误抛出异常,还是应该像苹果在语言指南中建议的那样使用断言。



 类似资料:
  • 本文向大家介绍Go语言中错误处理实例分析,包括了Go语言中错误处理实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言中错误处理的方法。分享给大家供大家参考。具体分析如下: 错误是可以用字符串描述自己的任何东西。 主要思路是由预定义的内建接口类型 error,和其返回返回字符串窜的方法 Error 构成。 type error interface { Error() strin

  • 主要内容:net 包中的例子,错误接口的定义格式,自定义一个错误,示例:在解析中使用自定义错误Go语言的错误处理思想及设计包含以下特征: 一个可能造成错误的函数,需要返回值中返回一个错误接口(error),如果调用是成功的,错误接口将返回 nil,否则返回错误。 在函数调用后需要检查错误,如果发生错误,则进行必要的错误处理。 Go语言没有类似 Java 或 .NET 中的异常处理机制,虽然可以使用 defer、panic、recover 模拟,但官方并不主张这样做,Go语言的设计者认为其他

  • 问题内容: 我正在尝试使用swift和firebase在iOS项目中创建用户按钮时添加错误处理: 这是按钮的代码: 我不确定switch语句中错误的语法是否正确! 因为当我在模拟器中对其进行测试时,它始终会给我提供默认情况,这是未知错误!+我在文档中找不到语法:https : //firebase.google.com/docs/auth/ios/errors 因此,使用新的firebase和sw

  • 我完全知道Swift没有一个try/catch机制来捕捉异常(好的,Swift2.0现在支持它们)。我还了解到,许多API方法返回一个NSError,如果出现问题,该NSError将被一个错误对象填充。所以请不要向我提出这个问题:Swift语言中的错误处理 但这仍然不能解释如何对您自己代码中的运行时错误做出反应,比如数组越界访问或强制展开一个为nil的可选值。例如: 或 每个程序员都会偶尔犯这样的

  • 8: 46:12814错误[org.apache.catalina.core.ContainerBase.[jboss.web]。[默认主机]。[/ecmfi]。[操作]](http--192.168.192.38-8080-4)Servlet。servlet操作的service()引发异常:java。lang.IllegalStateException:参数处理失败。位于组织。阿帕奇。公猫uti

  • 问题内容: 我遇到了我不知道的代码问题。安装Xcode 7 Beta并将Swift代码转换为Swift 2之后 码: 屏幕截图: 问题答案: 从Swift 2开始,将产生错误的Cocoa方法转换为引发错误的Swift函数。 而不是 Swift 1.x 中的可选返回值和错误参数: 在 Swift 2中, 该方法现在返回非可选值,并在错误情况下引发错误,必须使用try-catch处理: 有关更多信息,