本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(八)——异常处理
本文链接:Scala学习(八)——异常处理
简介
要编写一个好的程序,异常处理非常必要。Scala提供了和其他语言类似的异常处理方式。
throw
语句
Scala可以直接抛出Java中的任意Throwable
类型的对象:
1 |
throw new Exception("Some Error") |
异常抛出检查
Scala取消了Java中的抛出异常声明和检查,所以不存在throws
关键字。同样,Scala中所使用Java库的抛出异常声明也不需要理会。
然而,当真的抛出了异常时,如果没有被捕获,程序会崩溃的。
try...catch
语句
Scala使用类似match
语句的方式来处理catch
中的每一个分支。
1 2 3 4 5 6 7 8 |
class AException extends Exception try { throw new AException } catch { case e: AException => println("exception") // 输出 exception case e: Throwable => println("throwable") } |
从下面这个例子中可以看出其实它和match
语句几乎无差别:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
object ExceptionFactory { def apply(m: String) = new Exception(m) def unapply(a: Any) = a match { case a: Exception => Some(a.getMessage) case _ => None } } try { throw ExceptionFactory("Some Error") } catch { case ExceptionFactory(m) => println("exception: " + m) // 输出 exception: Some Error case e: Throwable => println("throwable") } |
既然形式和match
语句类似,那么返回值呢?确实也和match
语句类似:
1 2 3 4 5 6 7 8 |
val a = try { throw ExceptionFactory("Some Error") "normal" } catch { case ExceptionFactory(m) => "exception: " + m case e: Throwable => "throwable" } println(a) // 输出 exception: Some Error |
如果上例没有抛出异常,会输出normal。
finally
语句
和其他语言类似,Scala的try...catch
最后也可以加finally
。用法和效果都是一样的。
当然,也可以直接写try...finally
,只不过这样无法捕获异常。
总结
异常处理几乎是一个语言的必要部分(除了C语言以及一些底层语言),Scala也不例外。Scala的异常处理特殊之处不多,参考其他语言的要求就好。