在处理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。有更好的方法吗?
最佳答案
如果你想替换 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
}
}
关于Swift 3 - 接住并抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43944687/