使用throws
的函数时,我们使用do-catch
来处理可能的错误。假设我们正在编写一个函数,我们希望函数传播错误:
public func myFunc() throws
{
do
{
let obj = try convert(param: 42)
// work with obj...
}
catch
{
print("failed: \(String(describing: error))")
throw MyError.ConversionFailed
}
}
那很好。但是,让我们说现在我们在myFunc
中有自定义逻辑可能导致函数抛出不同类型的错误:
public func myFunc() throws
{
do
{
let obj = try convert(param: 42)
// work with obj...
if obj is Array
{
// great, continue working with obj...
}
else
{
throw MyError.NotAnArray
}
}
catch
{
print("failed: \(String(describing: error))")
throw MyError.ConversionFailed
}
}
但是这不起作用:内部throw
将被do-catch
捕获而myFunc
只会抛出错误ConversionFailed
,而不是NotAnArray
错误。
使其发挥作用的一种方法是:
public func myFunc() throws
{
do
{
let obj = try convert(param: 42)
// work with obj...
if obj is Array
{
// great, continue working with obj...
}
else
{
throw MyError.NotAnArray(object: obj)
}
}
catch MyError.NotAnArray(let obj)
{
throw MyError.NotAnArray(object: obj)
}
catch
{
print("failed: \(String(describing: error))")
throw MyError.ConversionFailed
}
}
虽然有效但似乎重复,特别是当存在关联值时,如果自定义逻辑很复杂,我可能需要几个catch
es。有没有更好的方法呢?
答案 0 :(得分:1)
如果您想替换convert()
引发的错误
通过另一个错误然后在本地do / catch上下文中调用convert()
。
不需要外部do / catch,因为
投掷功能“自动”传播错误
到来电者(比较How to pass an Error up the stack trace in Swift)。
public func myFunc() throws
{
let obj: Any // or whatever type convert() returns
do {
obj = try convert(param: 42)
} catch {
throw MyError.ConversionFailed
}
// work with obj...
if obj is Array {
// great, continue working with obj...
} else {
throw MyError.NotAnArray
}
}