在我的申请中,我想:
- 在 fragment 中有一个方法 A
- 在方法 A 中,调用一个用 `@Throws(IOException::class)` 注释的方法 B
- 在方法 B 中,调用方法 C,它有一个 `try catch`,在 `catch` 处它`throw IOException(e)`
- 在方法 A 中收到错误并根据信息执行操作
到目前为止我有:
fun methodA() {
methodB()
//Get exception and do stuff
}
@Throws(IOException::class)
fun methodB() {
methodC()
}
fun methodC() {
try {
//Something that can throw exception
} catch (e: IOException) {
throw IOException(e)
}
}
这是正确的方式还是异常(exception)的方式?但是,我如何才能知道在方法 A 中抛出异常?我在想类似的事情:
fun methodA() {
try {
methodB()
} catch (e: IOException) {
//received exception thrown by method C and do stuff
}
}
我能用它实现我想要的吗?如果没有,你能帮我吗?
谢谢
最佳答案
您的代码应该可以工作(如果您使用第二个版本的 methodA()
)。但为什么要在 methodC()
中捕获异常,却抛出一个新的副本?相反,请考虑以下事项:
fun methodA() {
try {
methodB()
} catch (e: IOException) {
// error flow
}
}
@Throws(IOException::class)
fun methodB() {
methodC()
}
@Throws(IOException::class)
fun methodC() {
// do something that can throw exception
}
IOException
向上传播到 methodA()
,您可以在其中处理它。
您还可以考虑在调用堆栈的更深处捕获异常:
fun methodA() {
val err = methodB()
if (err) {
// error flow
} else {
// normal flow
}
}
fun methodB(): Boolean {
return methodC()
}
fun methodC(): Boolean {
return try {
// do something that can throw exception
false
} catch (e: IOException) {
true
}
}
现在,您应该使用这两种方法中的哪一种?这取决于您的实际代码。 Here是一个讨论。
(您提供的代码的另一个问题是 methodB()
是多余的。但我假设它在您的实际程序中做了一些有趣的事情。)
关于java - android - 处理异常以更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045400/