捕獲異常的方法有,Scala系列20:Scala中異常捕獲與拋出異常
捕獲異常的方法有,Scala系列20:Scala中異常捕獲與拋出異常
目錄
0.異常處理
1.捕獲異常
2.拋出異常
0.異常處理
來看看下面一段代碼
def main(args: Array[String]): Unit = {val i = 10 / 0println("你好!")}Exception in thread "main" java.lang.ArithmeticException: / by zeroat ForDemo$.main(ForDemo.scala:3)at ForDemo.main(ForDemo.scala)
執行程序,可以看到scala拋出了異常,而且沒有打印出來"你好"。說明程序出現錯誤后就終止了。
那怎么解決該問題呢?
在scala中,可以使用異常處理來解決這個問題?
1.捕獲異常
捕獲異常的方法有?語法格式
try {// 代碼
}
catch {case ex:異常類型1 => // 代碼case ex:異常類型2 => // 代碼
}
finally {// 代碼
}
尖叫提示:
- Scala中捕捉異常的catch子句,語法與其他語言中不太一樣。在Scala里,借用了模式匹配的思想來做異常的匹配,因此,在catch的代碼里,是一系列case字句
- try中的代碼是我們編寫的業務處理代碼
- 在catch中表示當出現某個異常時,需要執行的代碼
- 在finally中,是不管是否出現異常都會執行的代碼
示例說明
- 使用try..catch來捕獲除零異常
參考代碼
package com.robot.scalademoobject _08ObjectDemo {def main(args: Array[String]): Unit = {try {val i = 10 / 0println("你好!")} catch {//case ex: Exception => println(ex.getMessage) // / by zerocase ex:Exception => ex.printStackTrace() //調用自帶方法打印,case只執行一個。}finally {println("我一定會執行,不管異常上面發生了什么")}}
}
/***java.lang.ArithmeticException: / by zeroat com.robot.scalademo._08ObjectDemo$.main(_08ObjectDemo.scala:7)at com.robot.scalademo._08ObjectDemo.main(_08ObjectDemo.scala)我一定會執行,不管異常上面發生了什么*/
2.拋出異常
我們也可以在一個方法中,拋出異常。語法格式和Java類似,使用throw new Exception...
scalar函數、示例說明
- 在main方法中拋出一個異常
參考代碼
//scala主動拋出異常
package com.robot.scalademoobject _08ObjectDemo {def main(args: Array[String]): Unit = {throw new Exception("這是一個異常")}
}
/***
Exception in thread "main" java.lang.Exception: 這是一個異常at com.robot.scalademo._08ObjectDemo$.main(_08ObjectDemo.scala:6)at com.robot.scalademo._08ObjectDemo.main(_08ObjectDemo.scala)*///2.Scala捕獲主動拋出的異常
package com.robot.scalademoobject _08ObjectDemo {def main(args: Array[String]): Unit ={try {throw new Exception("這是一個異常")}catch {case ex:Exception => print("哈哈,被我捕獲了")}}
}
/***
哈哈,被我捕獲了*/
尖叫提示:注意在scala不需要在方法上聲明要拋出的異常,它已經解決了再Java中被認為是設計失敗的檢查型異常。
?