Scala学习笔记17: Try与异常处理
目录
- 第十七章 Try与异常处理
- 1- 异常的抛出和捕获
- 1. 异常抛出
- 2. 异常捕获
- 2- 函数式的错误处理
- 1. `Try` 类型
- 2. 使用 `Try`
- 3. 处理 `Try` 结果
- 4. `Try` 的常用方法
- 5. `Try` 的优势
- 总结
- end
第十七章 Try与异常处理
1- 异常的抛出和捕获
Scala 的异常处理机制与 Java非常相似, 但也有一些区别 ;
1. 异常抛出
- Scala 使用
throw关键字抛出异常, 和 Java一样 ; - Scala 没有"受检异常" (checked Exception) 的概念 ; 不需要声明函数可能抛出的异常 ;
示例:
def divide(a: Int, b: Int): Int = {if (b == 0) {throw new IllegalArgumentException("Divisor cannot be zero!!!")}a / b}
def main(args: Array[String]): Unit = {val res = divide(10, 0)println(res) // Output: java.lang.IllegalArgumentException: Divisor cannot be zero!!!}
2. 异常捕获
- Scala使用
try...catch...finally结构捕获异常, 与 Java 类似, 但catch部分使用模式匹配来处理不同类型的异常 ; finally子句是可选的, 用于执行无论是否发生异常都需要执行的代码, 例如关闭资源 ;
示例:
def divide(a: Int, b: Int): Int = {if (b == 0) {throw new IllegalArgumentException("Divisor cannot be zero!!!")}a / b}
try {val res = divide(10, 0)println(res)} catch {case e: IllegalArgumentException => println(s"捕获到异常: ${e.getMessage}") // Output: 捕获到异常: Divisor cannot be zero!!!} finally {println("finally: 无论是否发生异常都会执行;") // Output: finally: 无论是否发生异常都会执行;}
说明:
- try块: 包含可能抛出异常的代码 ;
- catch块: 捕获异常; Scala的
catch块是一个模式匹配的例子, 每个case分支处理不同类型的异常 ; - finally块: 包含总是会执行的代码 (不管是否抛出异常) ; 通常用于释放资源, 如关闭文件或数据库连接 ;
Scala 的异常处理机制结合了 Java的 try...catch...finally 结构和自身的模式匹配, 提供了更灵活、更强大的异常处理能力 ;
同时, Try 类型为开发者提供了更函数式的异常处理方式, 使代码更简洁易懂 .
2- 函数式的错误处理
在Scala中, 函数式编程风格推崇使用不可变数据和纯函数, 尽量避免副作用和异常 ;但实际应用中, 异常难以完全避免 ;
Scala提供了 Try 类型, 让我们可以用更函数式的方法来处理异常 ;
1. Try 类型
Try 是 Scala中用于表示可能抛出异常的操作的结果类型 ; 它有两个子类:
Success[T]: 表示操作成功, 包含成功的结果值, 类型为T;Failure[T]: 表示操作失败, 包含抛出的异常信息, 类型为Throwable;
2. 使用 Try
可以使用 Try 的伴生对象的 apply 方法将可能抛出异常的代码块包起来 :
示例:
import scala.util.Trydef riskyOperation(x: Int): Int = {if (x < 0) {throw new IllegalArgumentException("x must be positive")} else x * 2}val result: Try[Int] = Try(riskyOperation(-1))println(result) // Output: Failure(java.lang.IllegalArgumentException: x must be positive)val result2: Try[Int] = Try(riskyOperation(5))println(result2) // Output: Success(10)
3. 处理 Try 结果
可以用模式匹配的方式处理 Try 的结果:
import scala.util.{Try, Success, Failure}def riskyOperation(x: Int): Int = {if (x < 0) {throw new IllegalArgumentException("x must be positive")} else x * 2}val result1: Try[Int] = Try(riskyOperation(-1))result1 match {case Success(value) => println(s"Success: $value")case Failure(exception) => println(s"Failure: ${exception.getMessage}")}// Output: Failure: x must be positiveval result2: Try[Int] = Try(riskyOperation(5))result2 match {case Success(value) => println(s"Success: $value")case Failure(exception) => println(s"Failure: ${exception.getMessage}")}// Output: Success: 10
4. Try 的常用方法
Try 提供了一些方便地方法来处理异常, 例如:
map: 如果Try是Success, 则对成功的结果值应用函数, 并返回新的Try; 如果是Failure, 则直接返回Failure;flatMap: 与map类似, 但函数需要返回一个Try类型的值 ;recover: 如果Try是Failure, 则应用偏函数来处理异常, 并返回新的Try; 如果是Success, 则直接返回Success;getOrElse: 如果Try是Success, 则返回成功的结果值; 如果是Failure, 则返回默认值 ;
5. Try 的优势
- 避免
try...catch语句的嵌套, 使代码更简洁易读 ; - 将异常处理融入函数式编程风格, 可以使用
map、flatMap等高阶函数 ; - 更容易组合和传递可能抛出异常的操作的结果 ;
总结
Try 类型是 Scala中函数式异常处理的重要工具, 它让挖煤可以用更优雅、更简洁的方式来处理异常, 使代码更易于理解和维护 .
end
相关文章:
Scala学习笔记17: Try与异常处理
目录 第十七章 Try与异常处理1- 异常的抛出和捕获1. 异常抛出2. 异常捕获 2- 函数式的错误处理1. Try 类型2. 使用 Try3. 处理 Try 结果4. Try 的常用方法5. Try 的优势总结 end 第十七章 Try与异常处理 1- 异常的抛出和捕获 Scala 的异常处理机制与 Java非常相似, 但也有一些…...
内网信息收集——MSF信息收集浏览器记录配置文件敏感信息
文章目录 一、配置文件敏感信息收集二、浏览器密码&记录三、MSF信息收集 域控:windows server 2008 域内机器:win7 攻击机:kali 就是红日靶场(一)的虚拟机。 一、配置文件敏感信息收集 使用searchall64.exe&#…...
C++ STL中的std::remove_if 的用法详解
在现代C++编程中,标准模板库(STL)提供了一系列功能强大的算法,这些算法极大地简化了日常的编程任务。其中,std::remove_if是一个非常实用的函数,它允许我们从容器中移除满足特定条件的所有元素。本文将深入探讨std::remove_if的使用方法,并通过一个具体的例子——基于St…...
基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)
本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…...
Docker 日志丢失 - 解决方案
Docker 日志默认使用的是 journald 的方式. RateLimitBurst 是 journald 的一个参数,用于限制日志的速率。如果日志的生成速度超过这个限制,journald 可能会丢弃日志。你可以通过调整这个参数来避免日志被丢弃。 调整 RateLimitBurst 和 RateLimitInte…...
物联网环境下机器人隐私保护法律框架研究-隐私保护法律监管平台
1. 引言 物联网技术的发展推动了机器人在家庭、医疗、工业等领域的广泛应用。然而,这些智能设备在数据采集和处理过程中面临着巨大的隐私保护挑战。本设计方案旨在构建一个全面的隐私保护法律监管平台,确保物联网环境下机器人的隐私数据得到有效保护,并符合相关法律法规的要…...
设计模式-创建型模式之工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。 工厂方法模式的主要角色: 抽象工厂(AbstractFactory):提供了创建产品的接…...
婚礼成本与筹备策略:一场梦幻婚礼的理性规划
婚礼成本与筹备策略:一场梦幻婚礼的理性规划 摘要 婚礼,作为人生中的重要仪式,承载着新人的爱情与梦想,同时也伴随着不菲的经济投入。本文旨在探讨婚礼所需的大致成本、影响成本的主要因素以及婚礼筹备过程中的关键注意事项&…...
前端a-tree遇到的问题
在使用a-tree时候,给虚拟滚动的高度,然后展开a-tree滑动一段距离 比如这样 随后你切换页面,在返回这个页面的时候 就会出现这样的bug 解决方法: onBeforeRouteLeave((to, from, next) > {// 可以在路由参数变化时执行的逻辑ke…...
SpringCloud教程 | 第十篇: 读取Nacos的配置
1、引入依赖 <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.7</version></dependency> 2、在启动类加上 NacosPropertySource(dataId"nac…...
漏洞-Alibaba Nacos derby 远程代码执行漏洞
【漏洞详情】 漏洞描述:Alibaba Nacos derby 存在远程代码执行漏洞,由于Alibaba Nacos部分版本中derby数据库默认可以未授权访问,恶意攻击者利用此漏洞可以未授权执行SQL语句,从而远程加载恶意构造的jar包,最终导致任意…...
SpringBoot解决Apache Tomcat输入验证错误漏洞
Apache Tomcat是美国阿帕奇(Apache)基金会的一款轻量级Web应用服务器。该程序实现了对Servlet和JavaServer Page(JSP)的支持。 Apache Tomcat存在输入验证错误漏洞,该漏洞源于HTTP/2请求的输入验证不正确,会…...
echarts解决数据差异过大的问题
问题描述 使用echarts折线图和柱状图展示数据时,如果数据差异值较大,会导致显示图形差异过大,图表不美观。 如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000],渲染出来的效果如下图: 可以看到由于最大值和最小值差…...
Oracle 常用系统
常用系统包 查看系统包 SELECT * FROM all_objects WHERE object_type PACKAGE AND owner SYS AND object_name 包名称;AUTO_SERVER_PKG AUTO_SERVER_PKG 在Oracle数据库的上下文中,并不是一个标准的Oracle系统包或内置功能。然而,在参考文章中提到…...
WPS点击Zotero插入没有任何反应
wps个人版没有内置vba,因此即便一下插件安装上了(如Axmath,zotero),当点击插件的时候会出现“点不动”、“点击插件没反应的现象。至于islide一类的插件,干脆连装都装不上。 这就需要手动安装一下vba。 针…...
uniapp 实现上传文件的功能
上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片:", temp…...
apache Kylin系列介绍及配置
Apache Kylin是一个开源的分布式分析引擎,用于OLAP(联机分析处理)数据处理。它专门设计用于处理大规模的数据集,并提供快速的查询和分析能力。 apache Kylin架构: Apache Kylin是一个开源的分布式分析引擎,旨在提供高性能、低延迟的OLAP(联机分析处理)能力。下面是Ap…...
【Qt 初识】QPushButton 的详解以及 Qt 中的坐标
文章目录 1. Qt 中的信号槽机制 🍎2. 通过图形化界面的方式实现 🍎3. 通过纯代码的方式实现按钮版的HelloWorld 🍎4. 设置坐标 🍎 1. Qt 中的信号槽机制 🍎 》🐧 本质就是给按钮的点击操作,关联…...
道路运输企业管理人员安全考核试题(附答案)
1、【多选题】《道路旅客运输企业安全管理规范》规定,客运企业应当制定车辆动态监控操作规程。操作规程的内容包括( )。(ABCD) A、卫星定位装置、视频监控装置、动态监控平台设备的检修和维护要求 B、动态监控信息采集、分析、处理规范和流程 C、违法违规信息统…...
免费开源的工业物联网(IoT)解决方案
什么是 IoT? 物联网 (IoT) 是指由实体设备、车辆、电器和其他实体对象组成的网络,这些实体对象内嵌传感器、软件和网络连接,可以收集和共享数据。 IoT 设备(也称为“智能对象”)范围广泛,包括智能恒温器等…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
