当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Swift Error用法及代码示例

协议

Error

表示可以抛出的错误值的类型。

声明

protocol Error : Sendable

概述

任何声明符合 Error 协议的类型都可以用来表示 Swift 错误处理系统中的错误。因为Error 协议没有自己的要求,所以您可以声明与您创建的任何自定义类型的一致性。

使用枚举作为错误

Swift 的枚举非常适合表示简单的错误。创建一个符合 Error 协议的枚举,并为每个可能的错误提供一个案例。如果有可能有助于恢复的有关错误的其他详细信息,请使用关联值来包含该信息。

以下示例显示了 IntParsingError 枚举,该枚举捕获在从字符串解析整数时可能发生的两种不同类型的错误:溢出,其中字符串表示的值对于整数数据类型来说太大,以及无效输入,其中在输入中找到非数字字符。


enum IntParsingError: Error {
    case overflow
    case invalidInput(Character)
}

invalidInput case 包含无效字符作为关联值。

下一个代码示例显示了 Int 类型的可能扩展,它解析 String 实例的整数值,在解析过程中出现问题时抛出错误。


extension Int {
    init(validating input: String) throws {
        // ...
        let c = _nextCharacter(from: input)
        if !_isValid(c) {
            throw IntParsingError.invalidInput(c)
        }
        // ...
    }
}

do 语句中调用新的 Int 初始化程序时,您可以使用模式匹配来匹配自定义错误类型的特定情况并访问它们的关联值,如下例所示。


do {
    let price = try Int(validating: "$100")
} catch IntParsingError.invalidInput(let invalid) {
    print("Invalid character: '\(invalid)'")
} catch IntParsingError.overflow {
    print("Overflow error")
} catch {
    print("Other error")
}
// Prints "Invalid character: '$'"

在错误中包含更多数据

有时您可能希望不同的错误状态包含相同的公共数据,例如文件中的位置或应用程序的某些状态。当你这样做时,使用一个结构来表示错误。以下示例在解析 XML 文档时使用结构来表示错误,包括发生错误的行号和列号:


struct XMLParsingError: Error {
    enum ErrorKind {
        case invalidCharacter
        case mismatchedTag
        case internalError
    }


    let line: Int
    let column: Int
    let kind: ErrorKind
}


func parse(_ source: String) throws -> XMLDoc {
    // ...
    throw XMLParsingError(line: 19, column: 5, kind: .mismatchedTag)
    // ...
}

再一次,使用模式匹配来有条件地捕获错误。以下是捕获 parse(_:) 函数抛出的任何 XMLParsingError 错误的方法:


do {
    let xmlDoc = try parse(myXMLData)
} catch let e as XMLParsingError {
    print("Parsing error: \(e.kind) [\(e.line):\(e.column)]")
} catch {
    print("Other error: \(error)")
}
// Prints "Parsing error: mismatchedTag [19:5]"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Error。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。