android - 处理更新UI的异常

问题描述 投票:1回答:1

在我的申请中,我想:

  • 在Fragment中有一个方法A.
  • 从方法A中,调用一个用`@Throws(IOException :: class)`注释的方法B.
  • 从方法B中,调用一个方法C,它有一个`try catch`,在`catch`它``抛出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)
    }
}

这是正确的方式还是例外方式?但是,如何在方法A中抛出异常呢?我想的是:

fun methodA() {
    try {
        methodB()
    } catch (e: IOException) {
        //received exception thrown by method C and do stuff
    }
}

我能用这个达到我想要的效果吗?如果没有,你能帮助我吗? 谢谢

java android exception kotlin try-catch
1个回答
1
投票

您的代码应该有效(如果您使用的是第二版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()是多余的。但我会假设它在你的实际程序中做了一些有趣的事情。)

© www.soinside.com 2019 - 2024. All rights reserved.