Xcode报错:Errors thrown from here are not handled because the enclosing catch is not exhaustive
Xcode报错:Errors thrown from here are not handled because the enclosing catch is not exhaustive

Xcode报错:Errors thrown from here are not handled because the enclosing catch is not exhaustive

SwiftUI在使用do-catch语句捕获内容时,发生报错:

do {
    if tab == .LifeSavingsBank {
        try lifeSavingsBankCalculate()
    } else if tab == .EmergencyFund {
        try emergencyFundCalculate()	// 报错行
    }
} catch CalculationError.invalidInput {
    print("捕获报错")
    showError()
}

Xcode报错:

Errors thrown from here are not handled because the enclosing catch is not exhaustive

原因在于 Swift 要求 do-catch 必须处理所有可能的 throw 情况,这里的 catch CalculationError.invalidInput 只捕获了 CalculationError.invalidInput。

但报错的方法里可能抛出其他类型的错误(比如 createLifeSavingBank()、emergencyFundCalculate() 都是 throws,可能抛出不同错误),所以 Swift 会提示 “catch 不够全面”。

解决方案

增加 catch 捕获所有其他错误:

do {
    if tab == .LifeSavingsBank {
        try lifeSavingsBankCalculate()
    } else if tab == .EmergencyFund {
        try emergencyFundCalculate()    // 报错行
    }
} catch CalculationError.invalidInput {
    print("捕获报错")
    showError()
} catch {
    print("捕获其他错误: \(error)")
    showError()
}

这样就覆盖了所有可能抛出的错误,Swift 就不会再报“不完整捕获”了。

总结

该报错原因在于 Swift 要求 do-catch 必须处理所有可能的 throw 情况。

如果在do-catch语句中,使用 Task 异步任务:

do {
    Task { @MainActor in
        try lifeSavingsBankCalculate()
        await runLifeSavingBankAnimation()
        step = .create
    }
} catch let error as CalculationError {
    print("捕获 CalculationError: \(error)")
    showError()
} catch {
    print("其他错误: \(error)")
    showError()
}

Task 中的异步函数抛出的错误不会被外层的 do-catch 捕获,因为它在异步任务中。

Task 内的try报错需要在 Task 内部自己处理,或者使用 try? 调用,否则外层 do-catch 捕获不到。

Task { @MainActor in
    do {
        try lifeSavingsBankCalculate()
    } catch {
        print("Task 内捕获错误: \(error)")
        showError()
    }
    await runLifeSavingBankAnimation()
    step = .create
}

外层 do-catch 只会捕获同步代码里的 throws,不会捕获异步 Task 内的 throw。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注