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. 圆周率一千万亿位_圆周率已经到了十万亿位了,为什么还要计算下去?有什么意义吗?...
  2. 微信支付退款结果通知解密 base64_decode / md5 / AES
  3. python 定义method_python进阶14:实例方法和类方法、types.MethodType()
  4. iphone9发布_【60秒半导体新闻】消息称国外疫情爆发让苹果取消发布会 iPhone 9跳票/华为P40全家福:7种配色、陶瓷尊享版配豪华五摄...
  5. python基础教程博客_python基础教程(十)
  6. python不用中间变量交换值_不使用中间变量,交换int型的 a, b两个变量的值。
  7. maven项目没有src/test/java和src/test/resources目录问题解决
  8. Linux命令解释之passwd
  9. linux系统支持什么格式的软件吗,UOS系统支持什么样的软件包格式:其实Deb,Rpm,Tar.gz源码包都行...
  10. 高等数学张宇18讲 第十一讲 二重积分
  11. c++实现解释器模式完整源代码
  12. log4j2关闭debug日志
  13. 计算机怎么打不开照相机图片,Win10系统相机打不开怎么办-电脑自学网
  14. 磁盘配额超出 linux,Linux磁盘配额应用
  15. ipa包安装到苹果手机中的几种方式——Qt for IOS
  16. 给IT新人的15个建议:苦逼程序员的辛酸反省与总结!
  17. yum是干什么的_yum 安装是什么
  18. IT售前如何写解决方案分析
  19. 网大网剧备案要避免的几大错误,内附最新备案流程!
  20. Unity实现推箱子

热门文章

  1. 反手几行命令就安装好了Elasticsearch集群
  2. ComplexHeatmap学习笔记和总结
  3. CSDN更换博客皮肤教程
  4. 服务器延迟高,ping丢包是什么问题?
  5. singan:learning a generative model from a single natural image
  6. springboot+mybatisplus整合hana数据库,多数据源方式
  7. Creation and validation of a chest X-ray dataset with eye-tracking and report dictation for AI devel
  8. 计算机增加用户win7,win7系统添加用户组的两种方法(图文)
  9. 通过session保存数据
  10. steam asf挂卡_如何发送任何金额的Steam数字礼品卡