Sim*_*lGy 7 error-handling switch-statement swift
我正在寻找一种方法来捕获多种类型的错误catch.我已经尝试过fallthrough将逗号分隔的样式与switch语句分开,但都不起作用.该文档只字不提追赶数倍,但pattern 1.我不清楚哪种模式语法可以在这里工作.
错误定义(示例):
enum AppErrors {
case NotFound(objectType: String, id: Int)
case AlreadyUsed
}
Run Code Online (Sandbox Code Playgroud)
作品:
do {
//...
} catch AppErrors.NotFound {
makeNewOne()
} catch AppErrors.AlreadyUsed {
makeNewOne()
} catch {
print("Unhandled error: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
不编译,是否可以做这样的事情?
do {
//...
} catch AppErrors.NotFound, AppErrors.AlreadyUsed {
makeNewOne()
} catch {
print("Unhandled error: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
nhg*_*rif 10
如果你想抓住所有AppErrors,你可以使用这种模式:
catch is AppErrors
Run Code Online (Sandbox Code Playgroud)
如果你正在寻找更具体的匹配,它似乎很快变得难看.
这将让我们抓住以下具体案例AppErrors:
catch let error as AppErrors where error == .NotFound || error == .AlreadyUsed
Run Code Online (Sandbox Code Playgroud)
还有这种语法似乎有效:
catch let error as AppErrors where [.NotFound, .AlreadyUsed].contains(error)
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我还将添加此选项,它允许我们捕获两种不同类型的错误,但它不允许我们指定这些类型中的哪种情况:
catch let error where error is AppErrors || error is NSError
Run Code Online (Sandbox Code Playgroud)
最后,基于我们捕获的任何东西都符合ErrorType协议的事实,我们可以清理我提供的ErrorType扩展的第二个和第三个示例,并结合使用where我们的一个子句catch:
extension ErrorType {
var isFooError: Bool {
guard let err = self as? AppErrors else { return false }
return err == .NotFound || err == .AlreadyUsed
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样抓住它:
catch let error where error.isFooError
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1810 次 |
| 最近记录: |