斯威夫特3 - 抓住并扔掉

时间:2017-05-12 18:51:10

标签: swift error-handling swift3

使用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。有没有更好的方法呢?

1 个答案:

答案 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
    }
}