Kotlin异常处理
在本教程中,我们将讨论Kotlin中的异常处理。
什么是例外?
异常可能会破坏您的程序。
这使得异常处理成为任何编程语言的重要组成部分。
使用异常处理,您可以处理错误并防止可能导致程序停止的运行时崩溃。
相反,使用异常处理可以优雅地处理失败的条件,并继续执行程序流程。
Java中的检查异常与未检查异常通常,检查异常是在方法上设置的,并在编译时进行检查。
相反,未检查的异常派生自RuntimeExceptions并在运行时进行检查。
Kotlin例外
所有异常均来自Throwable类。
要抛出异常,我们使用throw关键字。
throw Exception("Oops. Something went wrong")
在Kotlin中,没有检查过的异常。
这意味着没有throws关键字。
try-catch-finally
为了处理异常,我们使用try-catch块。
在try块中设置了可能给出异常的代码段。
异常捕获在catch块内。
无论发生什么情况,finally块始终运行。
finally块是可选的。
通常用于释放try-catch中使用的所有资源。
通常,一次尝试可以有多个收获。
只运行第一个匹配的捕获。
因此,建议按以下顺序堆叠捕获:特定异常到常规异常。
fun main(args: Array<String>) {
try {
var a = 0
var x = 7/a
val v = "theitroad.local"
v.toInt()
} catch (e: ArithmeticException) {
println("Arthimetic Exception")
} catch (e: Exception) {
println("Exception occured. To print stacktrace use e")
} finally {
println("Finally. It's over")
}
}
//Prints
//Arthimetic Exceptions
一旦在" try"块中发现异常,它就不会在该try块中执行其他任何操作。
我们甚至可以将" try"与" finally"一起使用。
try{
throw Exception("Hi. how are you?")
}finally {
println("Finally. Good.")
}
尝试一下,必须至少有一个陷阱或者最后一个障碍物。throw是一个表达式,也可以打印堆栈跟踪。
try是一种表达式
可以在try-catch块中执行的值可以返回并存储在变量中。
fun main(args: Array<String>) {
var x= "Androidly.net"
var a = try { x.toInt() } catch (e: NumberFormatException) { "This is a string" }
println(a)
x = "5"
a = try { x.toInt() } catch (e: NumberFormatException) { "This is a string" }
println(a)
}
在上面的代码中,我们可以为变量a设置两种不同类型的值。
如果try语句未执行,则设置catch的值。
无论设置了哪个,都不会将" finally"语句设置为表达式。
fail函数
这是捕获异常的快捷方式,如下所示。
import kotlin.test.fail
class User {
var name: String? = ""
}
fun main(args: Array<String>) {
var user = User()
user.name = null
val n: String = user.name ?: fail("No name found")
print(5)
}
如果执行了fail语句,则程序在打印后将无法运行。
隐式地,fail语句包含throw关键字。
fail函数如下所示:
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
没有什么是抛出回报的特殊回报类型。
在上面的示例中,fail函数还会打印我们并不总是想要的堆栈跟踪。
我们可以覆盖fail函数以仅打印消息。
class User {
var name: String? = ""
}
fun main(args: Array<String>) {
var user = User()
user.name = null
val n: String = user.name ?: fail("No name found")
println(n)
print(10)
}
fun fail(message: String): Nothing {
val throwable = Throwable(message)
Thread.setDefaultUncaughtExceptionHandler { t, e -> System.err.println(e.message) }
throw throwable
}
//Prints
No name found
将内联函数与异常处理一起使用
我们在这里讨论了Kotlin中的内联函数。
为什么要使用内联函数?它们不会造成开销。
现在,我们已经看到try-catch块会变得凌乱和冗长。
让我们使用内联函数使其简洁明了,因为这正是Kotlin代码的优势所在。
fun main(args: Array<String>) {
simpleTryCatch {
var x = 0
var y = 7
var z = y/x
}
simpleTryCatch {
var x = "Androidly"
var number = x.toInt()
}
}
inline fun simpleTryCatch(action: () -> Unit) {
try {
action()
} catch (t: Throwable) {
println("Caught something. ${t.message}")
}
}

