在处理会抛出
异常的函数时,我们使用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
。有更好的方法吗?
aFunctionThatThrows()
抛出的错误吗?在这种情况下,您必须在本地do/catch上下文中调用该函数。 - Martin R