斯卡拉 |异常处理
什么是例外?
异常是在程序执行期间(即在运行时)发生的不希望的或意外事件。这些事件改变了程序在执行中的流控制。这些情况并不太危险,可以由程序处理。
异常层次结构
所有异常和错误类型都是Throwable类的子类,后者是层次结构的基类。一个分支由Exception领导。此类用于用户程序应捕获的异常情况。 NullPointerException 是此类异常的一个示例。 Java运行时系统(JVM)使用另一个分支Error来指示与运行时环境本身(JRE)有关的错误。 StackOverflowError 就是此类错误的一个示例。
Scala 中的异常
Scala 中的异常处理以不同的方式实现,但它的行为与Java完全一样,并且可以与现有的Java库无缝协作。在 scala 中,所有异常都是unchecked 。没有检查异常的概念 Scala 在选择是否捕获异常的能力方面提供了很大的灵活性。
注意:在编译时,在Java中会检查“已检查”异常。如果一个方法可能抛出一个IOException ,我们必须声明它。
Scala 异常是如何工作的?
scala 中的异常的工作方式与 C++ 或Java中的相同。当异常发生时,如前面示例中所示的 ArithmeticException,当前操作被中止,运行时系统寻找可以接受 ArithmeticException 的异常处理程序。使用最里面的此类处理程序继续控制。如果不存在这样的处理程序,则程序终止。
抛出异常
抛出异常。它看起来与Java中的相同。我们创建一个异常对象,然后使用 throw 关键字将其抛出。
句法:
throw new ArithmeticException
try/catch构造
Scala 中的 try/catch 结构与Java中的不同,Scala 中的 try/catch 是一个表达式。 Scala 中产生值的异常可以在 catch 块中进行模式匹配,而不是为每个不同的异常提供单独的 catch 子句。因为 Scala 中的 try/catch 是一个表达式。这是一个在 Scala 中使用常规 try-catch 块处理异常的示例。
// Scala program of try-catch Exception
import java.io.IOException
// Creating object
object GFG
{
// Main method
def main(args:Array[String])
{
try
{
var N = 5/0
}
catch
{
// Catch block contain cases.
case i: IOException =>
{
println("IOException occurred.")
}
case a : ArithmeticException =>
{
println("Arithmetic Exception occurred.")
}
}
}
}
输出:
Arithmetic Exception occurred.
在 Scala 中,单个 catch 块可以处理各种异常,从而提供了灵活性。
finally子句:
如果我们希望代码的某些部分不管表达式如何终止都执行,我们可以使用 finally 块。这是上面的一个例子:
// Scala program of finally Exception
// Creating object
object GFG
{
// Main method
def main(args: Array[String])
{
try
{
var N = 5/0
}
catch
{
// Catch block contain case.
case ex: ArithmeticException =>
{
println("Arithmetic Exception occurred.")
}
}
finally
{
// Finally block will execute
println("This is final block.")
}
}
}
输出:
Arithmetic Exception occurred.
This is final block.