在我的申请中,我想:
到目前为止,我有:
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
}
}
我能用这个达到我想要的效果吗?如果没有,你能帮助我吗? 谢谢
您的代码应该有效(如果您使用的是第二版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()
是多余的。但我会假设它在你的实际程序中做了一些有趣的事情。)