我是Kotlin开发的新手,并试图在Kotlin中创建一个使用Exception实例和一个类(例如RuntimeException)的函数来检查该实例是否是特定类的实例。想法是您已捕获到特定类型的异常。然后,您要遍历此异常的原因,直到找到了所要查找的特定异常为止。
fun findExceptionType(currentException : Throwable?, exceptionToFind: KClass<Throwable>): Throwable? {
var _currentException = currentException
while((_currentException!!.cause == null)!!) {
if (_currentException is exceptionToFind) {
return _currentException.cause
}
_currentException = _currentException.cause
}
return null
}
这个想法是它将继续遍历
exception.cause
,直到exception.cause
为null或找到要搜索的异常类型为止。这似乎已经实施了,所以我很惊讶自己必须自己实施。使用该实用程序功能的原因是避免遍历所有
exception.cause
,直到找到所需的特定类型为止。更加具体:
在Kotlin中,有一个'is'运算符,例如,您可以说
if (s is String)
,但是在我上面的函数中,我想通过像if (s is X)
这样的东西将其传递给函数来使其通用。 X
的类型是什么?目前,我使用了X
,但不确定KClass
运算符的类型签名是什么?
最佳答案
我同意@dyukha。在这里使用reified
类型参数非常方便。有了它,您可以像下面这样重写函数:
inline fun <reified T : Throwable> findExceptionType(throwable: Throwable?): T? {
var error = throwable
while (error !is T) {
error = error?.cause
}
return error
}
作为通用的
if (s is X) where X is passed into the function
,您可以使用以下代码:(x as? String)?.let { println(it) }
关于kotlin - 用 'is'运算符查找类实例的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433074/