Scala 优雅的异常处理之 try 与 Try

java将所有的错误封装为Throwable,Throwable下有两个子类:Error和Exception。scala本质上和java一样,都是运行在jvm上,同理scala也有和java类似的try catch异常处理机制,好处是scala有很多语法糖,在异常处理过程中可以节省开发者很大精力,下面看一下scala异常处理try与Try的使用:

try

基本写法

try是scala内用作异常处理的写法,最常用的写法就是 try catch finally

  def tryDemo(): Unit = {// tryval label = try {val value = redis.get("key")if (noRes.contains(value)) {"-1"} else {"1"}} catch {case e: Exception => {e.printStackTrace()"-1"}} finally {println("label处理完毕")}println(label)}

Exception

这里catch到exception会进行异常处理,并返回默认值-1,Exception是java.lang.Exception,catch Exception会捕捉到如下Exception异常,但是捕捉不到error的情况:

java.lang.RuntimeException 系统异常
java.lang.NullPointerException 空指针异常
java.lang.ClassCastException 类型转换异常
java.lang.IndexOutOfBoundsException 下标越界
java.lang.ArrayIndexOutOfBoundsException 数组下标越界
java.lang.StringIndexOutOfBoundsException 字符串下标越界
java.lang.UnsupportedOperationException 不支持的操作异常
java.lang.IllegalArgumentException 非法参数异常
java.lang.NoSuchElementException 方位未找到异常
java.lang.NumberFormatException 数字格式异常
java.lang.AbstractMethodError 抽象方法错误
java.lang.InterruptedException 中断异常

Error

error是java.lang.Error,如果需要捕捉非Exception类异常,则只需修改成如下写法:

      case e: Error => {xxx}

一般在连接网络,初始化服务器失败时,会出现error的情况,一般情况下写bug的时候多为Exception

Scala语法糖

scala支持 _ 代表一切,常见的map(_.toString),foreach(println(_))等等,这里try catch支持这样的写法:

      case _ => {xxx}

catch后加这个可以视为捕捉一切异常,error,exception都包括,偷懒情况下或者对异常情况不清楚可以这么写,不过代码可读性差,而且maven打包时会提醒打包的warning。

Try

Try的机制有点类似option和Future,如果需要最终获取其中的值,需要通过.get获取,因为他们的执行都是不确定性的。

基本写法

    val numStr = "0"val num = Try(numStr.toInt).getprintln(num,num.getClass)
(0,int)

源码

object Try {/** Constructs a `Try` using the by-name parameter.  This* method will ensure any non-fatal exception is caught and a* `Failure` object is returned.*/def apply[T](r: => T): Try[T] =try Success(r) catch {case NonFatal(e) => Failure(e)}}

就是我们执行的操作,是执行后返回的结果,针对上面的例子,toIntInt,这里可以看到Try底层其实也是在使用try,Success是Try内的case class,也是Try的子类,类内提供了isSuccess,isFailure等方法,其返回值也是Try[T],e 是执行try时抛出的异常,从下面源码看到就是Throwable,包含了Error和Exception,当捕捉到异常时返回Failure,Failure和Success一样,也是Try的子类。

object NonFatal {/*** Returns true if the provided `Throwable` is to be considered non-fatal, or false if it is to be considered fatal*/def apply(t: Throwable): Boolean = t match {// VirtualMachineError includes OutOfMemoryError and other fatal errorscase _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => falsecase _ => true}/*** Returns Some(t) if NonFatal(t) == true, otherwise None*/def unapply(t: Throwable): Option[Throwable] = if (apply(t)) Some(t) else None
}

模式匹配判断Try内是否成功执行 match

      import scala.util.{Failure, Success, Try}      Try(num.toInt) match {case Success(value) => println("Success")case Failure(exception) => println("False")case _ => println("unKnown")}

通过match case模式匹配以及scala自带的Success类和Failure类,可以判断Try内逻辑是否执行正常,执行正常返回Success,执行错误返回Failure,这里.toInt是最常用的写法,里面也可以写复杂的逻辑,例如需要一些网络请求的任务,或者文件IO等等

恢复模式匹配并做异常处理 recover

    Try(num.toInt) recover {case e: Exception => 0case e: Error => 1case _ => 2}

这里和try catch flinaly其实两种写法都可以达成上述效果,即异常捕捉与修复,当Try内抛出异常时,根据异常处理判断出现异常后的处理动作,如果执行结果状态为Success,则不会触发后续的recover。

简洁写法

针对上述case match和recover,Try也提供了更简便的写法供开发者使用,即getOrElse,如果Try内成功,返回T,否则返回默认值,类似map和jsonObject的getOrElse。

A.try catch

    try {num.toInt} catch {case e: Exception => 0} 

B.if else

      if (num != null && num != "") {num.toInt} else {0}

C.Try

Try(num.toInt).getOrElse(0)

Scala 优雅的异常处理之 try 与 Try相关推荐

  1. c语言c2182是什么错误,C语言中一种更优雅的异常处理机制

    上一篇文章对C语言中的goto语句进行了较深入的阐述,实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支持形式.后来为了更好地.更方便地支持异常处理编程机制,使得程序员在 ...

  2. python切面异常处理_Spring项目中优雅的异常处理

    Spring项目中优雅的异常处理 前言 如今的Java Web项目多是以 MVC 模式构建的,通常我们都是将 Service 层的异常统一的抛出,包括自定义异常和一些意外出现的异常,以便进行事务回滚, ...

  3. 异常(什么是异常、异常的体系结构、优雅的异常处理、异常信息的分析与程序调试、自定义异常)

    (一) 什么是异常(程序没有语法错误, 可能产生的运行时错误) 比如你使用java程序开发了一个计算器,可以让用户进行计算,但是在计算除法的过程中(程序运行过程中),用户把除数设为0, 这时我们的程序 ...

  4. 2021年大数据常用语言Scala(三十四):scala高级用法 异常处理

    目录 异常处理 捕获异常 抛出异常 异常处理 Scala中 无需在方法上声明异常 来看看下面一段代码. def main(args: Array[String]): Unit = {val i = 1 ...

  5. 如何写出优雅的异常处理

    本来是想来自己写一篇关于断言的使用,正好看到了一个这个全面的文章.嗯,转给大家学习! 作者:巨人大哥 来源:cnblogs.com/jurendage/p/11255197.html 背景 软件开发过 ...

  6. java spring异常处理_Spring项目中优雅的异常处理

    前言 如今的Java Web项目多是以 MVC 模式构建的,通常我们都是将 Service 层的异常统一的抛出,包括自定义异常和一些意外出现的异常,以便进行事务回滚,而 Service 的调用者 Co ...

  7. 大数据必学语言Scala(三十四):scala高级用法 异常处理

    文章目录 异常处理 捕获异常 抛出异常 异常处理 Scala中 无需在方法上声明异常 来看看下面一段代码. def main(args: Array[String]): Unit = { val i ...

  8. classcastexception异常_优雅的异常处理

    代码正常运行不会出问题,但是遇到意外,参数变量,不符合要求,发生意外,代码终止运行 代码中的异常处理好了,代码就可以顺利的继续运行! 3.3 最近我们遇到过的异常 System.out.println ...

  9. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

最新文章

  1. python有什么功能-Python 3.9有什么新功能?
  2. missing closing parenthesis at end of #pragma
  3. JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
  4. vc2017 linux printf,C/C++中自定义信息输出——printf与宏的配合使用
  5. python toimage函数 -baijiahao_财码Python管理会计小实验成本性态分析So Easy
  6. 华为业务板块_复盘丨华为Mate30发布 电子板块再爆涨停潮
  7. Java NIO 读取文件、写入文件、读取写入混合
  8. Android Material文本字段
  9. Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M 1 1.2. 二:需要的jar包 1 2. Demo code 2 2.1. WCMapper 2 2.2. WC
  10. 关于C++ .h文件和.cpp文件的知识梳理
  11. c语言平方根求和用sqrt函数,sqrt函数 Excel怎么使用平方根函数SQRT
  12. spring Boot手把手教学(8): 封装统一返回实体类
  13. vue操作easyui中的DataGrid
  14. Java Server Faces_用JavaServer Faces开发Web应用(4) (转)
  15. 网络测速一原理及实例
  16. R语言——数据清洗之缺失值处理
  17. 如何解决微信端直接跳WAP端
  18. MyBatis(九):MyBatis类型处理器(TypeHandler)详解
  19. 前端传来的图片并保存_前端处理后端接口传递过来的图片文件
  20. 研究称太阳曾经有尘埃环,阻止超级地球形成

热门文章

  1. Windows系统如何配置pycharm的anaconda环境
  2. 必读的Python入门书籍,你都看过吗?(内有福利)
  3. android button背景图片变形,按钮背景图像拉伸(wrap_content或dp使用)
  4. Win11中文输入法安装失败怎么办?
  5. decker容器部署及常用操作
  6. duangduang
  7. 一篇吃饱 Structured Streaming
  8. [计算机网络]十三、配置iptables防火墙(SNAT和DNAT的策略及应用、使用layer7应用层过滤功能)
  9. stm32f103的io口复用_stm32-复用功能和重映射
  10. 大学生在校该如何平衡好学习理论和动手实践