Swift 3 - 接住并抛出

标签 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
    }
}

这行得通,但它似乎是重复的,尤其是当有关联值时,如果自定义逻辑很复杂,我可能需要多个 catches。有更好的方法吗?

最佳答案

如果你想替换 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/

相关文章:

swift - 运行脚本阶段错误 : framework is a directory

ios - swift UITableView 滞后于图像

xcode - NSDate() - Playground 与 Swift Xcode

C队列程序在满时不给出溢出错误

c# - 在Controller Web API中创建自定义错误401响应

r - 错误 : please supply starting values

ios - 找不到子项目(框架)的模块

swift3 - 牛顿 Gradle Playground 是否已移植到使用 swift 3 代码

ios - 如何在展开 subview 时在 TableView 单元格中添加 subview 并对 subview 的元素执行操作?

ios - 如何在 Swift 中从 textFieldDidEndEditing 调用 NSManagedObject validateValue