Kotlin异常处理

时间:2020-02-23 14:37:30  来源:igfitidea点击:

在本教程中,我们将讨论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}")
  }
}