Scala例外和try catch finally
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"); }