协议
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+
相关用法
- Swift EnumeratedSequence forEach(_:)用法及代码示例
- Swift EnumeratedSequence.Iterator map(_:)用法及代码示例
- Swift EnumeratedSequence.Iterator flatMap(_:)用法及代码示例
- Swift EmptyCollection first(where:)用法及代码示例
- Swift ExpressibleByIntegerLiteral用法及代码示例
- Swift EmptyCollection index(_:offsetBy:limitedBy:)用法及代码示例
- Swift EnumeratedSequence drop(while:)用法及代码示例
- Swift EmptyCollection partition(by:)用法及代码示例
- Swift EnumeratedSequence.Iterator allSatisfy(_:)用法及代码示例
- Swift ExpressibleByStringInterpolation init(stringInterpolation:)用法及代码示例
- Swift EmptyCollection prefix(upTo:)用法及代码示例
- Swift EmptyCollection starts(with:)用法及代码示例
- Swift EnumeratedSequence用法及代码示例
- Swift EmptyCollection.Iterator split(maxSplits:omittingEmptySubsequences:whereSeparator:)用法及代码示例
- Swift EmptyCollection.Iterator starts(with:)用法及代码示例
- Swift EnumeratedSequence.Iterator drop(while:)用法及代码示例
- Swift EmptyCollection.Iterator prefix(_:)用法及代码示例
- Swift EmptyCollection sorted(by:)用法及代码示例
- Swift EmptyCollection dropFirst(_:)用法及代码示例
- Swift EnumeratedSequence dropFirst(_:)用法及代码示例
- Swift EnumeratedSequence.Iterator filter(_:)用法及代码示例
- Swift EmptyCollection enumerated()用法及代码示例
- Swift EmptyCollection sort()用法及代码示例
- Swift EnumeratedSequence.Iterator reduce(into:_:)用法及代码示例
- Swift EnumeratedSequence compactMap(_:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Error。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。