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。
