Scala例外和try catch finally

时间:2020-01-09 10:47:18  来源:igfitidea点击:

Scala具有类似于Java的异常机制。

异常处理是一个相当大的主题,需要详细介绍。因此,我将在另一条更专业的文章中详细介绍Scala异常处理。在本文中,我将简要解释异常处理机制。

抛出异常

如果发生错误,Scala方法可以引发异常而不是正常返回。这是Java开发人员应该熟悉的示例:

//do something
//do something more

throw new IllegalArgumentException("arg 1 was wrong...");

//nothing is executed after the throw.

当抛出异常时,正常的执行线程被中断,并且该异常在调用堆栈中传播,直到catch子句捕获到该异常为止。

Try Catch

如果执行可能引发异常的代码序列,并且想要处理该异常,请使用try-catch块。这是一个例子:

try{
    throwsException();
    println("this line is never executed");
} catch {
  case e: Exception => println("exception caught: " + e);
}

//A METHOD THAT THROWS EXCEPTION
def throwsException() {
    throw new IllegalStateException("Exception thrown");
}

当从throwsException()方法内部抛出异常时,执行被中断,并且执行跳转到引发该异常的代码周围的catch子句

在上面的示例中,当调用throwsException()方法并引发异常时,将永远不会执行throwsException()方法调用下方的语句。取而代之的是执行跳到catch子句。

catch子句看起来与Java catch子句有些不同。 Scala要求我们编写一个case语句列表,而不是在catch关键字之后声明要在括号中捕获的异常。

在上面的示例中,仅捕获了一个异常,即" Exception",它是大多数异常的超类。因此,大多数异常是使用该catch子句捕获的。如果我们想更具体地说明要捕获的异常,请提供多个case语句。例如:

catch {
  case e: IllegalArgumentException => println("illegal arg. exception");
  case e: IllegalStateException    => println("illegal state exception");
  case e: IOException              => println("IO exception");
}

Finally

" finally"子句可以包含我们需要执行的代码,无论是否引发异常。这是一个例子:

try {
    throwsException();
} finally {
    println("this code is always executed");
}

将" finally"子句添加到" try"块中。如果愿意,我们也可以其中有一个catch子句。 " finally"子句仍然总是执行。

" finally"子句通常包含无论是否引发异常都必须执行的代码。例如,假设我们正在处理数据流。无论处理是否成功,还是导致引发异常,我们都希望关闭该数据流。

这是一个完整的示例,同时包含try,catch和finally子句:

try {

  throwsException();

} catch {

  case e: IllegalArgumentException => println("illegal arg. exception");
  case e: IllegalStateException    => println("illegal state exception");
  case e: IOException              => println("IO exception");

} finally {

  println("this code is always executed");
    
}