Dart 断言(assert)和异常

2023-11-02

一.断言(assert)

断言的作用是:如果表达式的求值结果不满足需要,则打断代码的执行。
可以要将提示消息附加到断言,添加一个字符串作为第二个参数。
实例:

void main()
{
	String urlString = 'http://www.baidu.com';
	assert(urlString.startsWith('https'), 'URL ($urlString) should start with "https".');
	// Failed assertion: 'urlString.startsWith('https')': URL (http://www.baidu.com) should start with "https"
	// 当urlString不是以https开头时,代码的执行会被打断
	// 当urlString是以https开头时,代码会继续执行
}

传入assert的参数,可以是任意表达式或者方法,只要返回值是bool就可以,当断言失败时(返回false),会抛出AssertionError异常。

注意:断言只有在检查模式下运行有效,在生产模式下是不会运行的。
二.异常

异常(或异常事件)是在执行程序期间出现的问题。发生异常时,程序的正常流程中断,程序/应用程序异常终止。
与Java相反,所有的dart异常都是未受检异常。也就是说当调用一个可以抛出异常的方法时,不必一定去捕获这个异常。这点和Kotlin一样,都是为了简化代码,增加可读性。如果你担心这段代码真的会产生什么异常,那么可以自行捕获。
Dart2的异常是Exception或者Error(包括它们的子类)的类型,甚至可以是非Exception或者Error类,也可以抛出,但是不建议这么使用。
Exception主要是程序本身可以处理的异常,比如:IOException。我们处理的异常也是以这种异常为主。
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 DartVM出现的问题。比如:内存溢出(OutOfMemoryError)等等。

1. 抛出异常

throw关键字用于显式引发异常。应该处理引发的异常,以防止程序突然退出。
语法:

throw new Exception_name()

实例:

void test_age(int age)
{
	if(age<0)
	{
		throw new FormatException();
	}
}

main()
{
	try
	{
		test_age(-2);
	}
	catch(e)
	{
		print('Age cannot be negative'); 
	}
	// 执行结果:
	//Age cannot be negative
}
2. 捕获异常
(1) tryoncatch

try块嵌入可能导致异常的代码。需要指定异常类型时使用on块。当处理程序需要异常对象时使用catch块。
try块必须紧跟一个on/catch块或一个finally块(或两者之一)。当try块中发生异常时,控制将转移到catch
处理异常的语法如下:

try
{ 
   // code that might throw an exception 
}  
on Exception1
{ 
   // code for handling exception 
}  
catch Exception2
{ 
   // code for handling exception 
}
注意:
1. 代码段可以有多个on/catch块来处理多个异常
2. on块和catch块是相互包含的,即try块可以与on块和catch块相关联

使用on块实例:

void main()
{ 
	int x = 12; 
	int y = 0; 
	int res;  

	try
	{
		res = x ~/ y; 
	}
	on IntegerDivisionByZeroException
	{
		print('Cannot divide by zero'); 
	}

	// 直径结果:
	// Cannot divide by zero
}

使用catch块实例:

void main()
{ 
	int x = 12; 
	int y = 0; 
	int res;  

	try
	{
		res = x ~/ y; 
	}
	catch(e)
	{
		print(e);
	}

	// 直径结果:
	// IntegerDivisionByZeroException
}

on…catch块实例:

void main()
{ 
	int x = 12; 
	int y = 0; 
	int res;  

	try
	{
		res = x ~/ y; 
	}
	on IntegerDivisionByZeroException catch(e)
	{
		print(e);
	}

	// 直径结果:
	// IntegerDivisionByZeroException
}
(2) finally

finally块包括应该执行的代码,而不管异常的发生。try/on/catch之后无条件执行可选的finally块。
使用finally块的语法如下:

try
{ 
   // code that might throw an exception 
}  
on Exception1
{ 
   // code for handling exception 
}  
catch Exception2
{ 
   // code for handling exception 
}
finally
{ 
   // code that should always execute; irrespective of the exception 
}

finally块实例:

void main()
{ 
	int x = 12; 
	int y = 0; 
	int res;  

	try
	{
		res = x ~/ y; 
	}
	on IntegerDivisionByZeroException
	{
		print('Cannot divide by zero');
	}
	finally
	{
		print('Finally block executed');
	}

	// 直径结果:
	// Cannot divide by zero
	// Finally block executed
}
(2) rethrow

可以使用rethrow关键字,重新抛出异常,如:

void misbehave()
{
	try
	{
		dynamic foo = true;
		print(foo++); 		// Runtime error
	}
	catch (e)
	{
		print('misbehave() partially handled ${e.runtimeType}.');
		rethrow; 			// Allow callers to see the exception.
	}
}

void main()
{
	try
	{
		// 虽然 catch 了异常,但是又 rethrow 了,所以要捕获
		misbehave();
	}
	catch (e)
	{
		print('main() finished handling ${e.runtimeType}.');
	}

	// 执行结果;
	// misbehave() partially handled NoSuchMethodError.
	// main() finished handling NoSuchMethodError.
}
(3) 自定义异常

Dart中的每个异常类型都是内置类Exception的子类。Dart可以通过扩展现有异常来创建自定义异常。
定义自定义异常的语法:

class Custom_exception_Name implements Exception
{ 
   // can contain constructors, variables and methods 
}

实例:

class AmtException implements Exception
{
	String errMsg() => 'Amount should be greater than zero';
}

void withdraw_amt(int amt)
{
	if (amt <= 0)
	{
		throw new AmtException();
	}
}

void main()
{
	try
	{
		withdraw_amt(-1);
	}
	catch(e)
	{
		print(e.errMsg());
	}
	finally
	{
		print('Ending requested operation.....');
	}
	// 执行结果: 
	// Amount should be greater than zero
	// Ending requested operation.....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart 断言(assert)和异常 的相关文章

  • kylin随笔

    1 kylin中一个segment是hbase中的一张表 可以通过修改kylin配置来决定将hbase这张表分为几个regin 以此来提高查询的并发度 2 增量日期分区表的合并 每天一个cube构建一个segment 存入hbase一张表
  • 引导微信用户关注公众号(详细步骤加代码)

    实现效果 当用户进入公众号h5页面 弹窗提示 是否要关注公众号 点击关注 跳转到微信关注页面 流程 1 用户在微信公众号端进入h5页面时 前端从后端数据库获取到用户关注状态 2 如果用户未关注 弹窗提示 是否关注公众号 不关注则取消弹窗 关
  • unity--01 个人实践安装与搭建环境

    首先按照网络上的去访问http www unity3d com 但 查找资料 应该访问https unity cn unity分为个人免费版和企业商用收费版 不过我点击下载的时候 并没有发现网络上所说要选择 个人版 压根没这个选项 试试看吧
  • 计算机二级C语言笔记(持续更新)

    C语言二级 第一章 1 1 1 1 1 C程序 程序 连续执行的一条条指令集合 机器语言 由0和1代码够成的二级制指令 源程序 高级语言编写的程序 目标程序 由二级制代码表示的程序 可执行程序 可以直接在操作系统上运行的程序 源程序 c 编
  • Java API

    目录 1 API 1 1API概述 2 String类 2 1String类概述 2 2String类的特点 2 3 String是什么 可以做什么 2 4String是不可变字符串的原因 2 5String类的构造方法 2 6字符串的比较
  • GreenPlum on K8s

    https pgconf in files presentations 2019 01 0103 Greenplum for Kubernetes PGConf India 2019 pdf About the Greenplum Oper
  • React 函数组件中使用hooks中得useState

    useState让函数组件有state 状态 并进行数据的读写操作 1 import React useState from react 引入useState 在函数中使用 const count setCount useState 0 数
  • RabbitMQ 同样的操作一次成功一次失败

    RabbitMQ 是一个功能强大的消息队列系统 广泛应用于分布式系统中 然而 我遇到这样的情况 执行同样的操作 一次成功 一次失败 在本篇博文中 我将探讨这个问题的原因 并提供解决方法 我是在表导出的时候发现的这个问题 因为我的某个设置的值
  • 影像维修工程师专项技能培训

    最近遇到很多咨询的人员都在对医疗行业产生疑惑 新闻报道说很多医院 公司的领导都被查 这样会不会影响设备维修方面 对后期找工作等有没有影响 总不能学好了技术却没有发挥的余地 最近确实是国家整体在对医疗方面做整改 7月21日 国家卫生健康委会同
  • 可重入函数与不可重入函数介绍

    不可重入函数的定义 在实时系统的设计中 经常会出现多个任务调用同一个函数的情况 如果有一个函数不幸被设计成为这样 那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据 从而导致不可预料的后果 这样的函数是不安全的函数 也叫不可重入函
  • python collections.OrderedDict() 用法

    Python中的字典对象可以以 键 值 的方式存取数据 OrderedDict是它的一个子类 实现了对字典对象中元素的排序 注意 OrderedDict的 Key 会按照插入的顺序排列 不是Key本身排序 比如下面比较了两种方式的不同 im
  • 使用HBuilderX将vue或H5项目打包app

    好久没有搞过将vue项目打包成app了 这两天刚好项目需要将vue开发的H5项目打包成APP 那就简单记录一次呗 之前也写过一篇打包app 是将项目使用hbuilder打开 转为webapp什么的 就可以直接打包了 现在不一样了 现在使用H
  • wstring 未定义的标识符,include

    wstring str L abcd VS2010提示 wstring未定义的标识符 include
  • 消息队列 RocketMQ:(九)消息重试

    文章目录 消息队列 RocketMQ 一 概述 消息队列 RocketMQ 二 系统架构 消息队列 RocketMQ 三 发送普通消息 三种方式 消息队列 RocketMQ 四 顺序消息 消息队列 RocketMQ 五 延时消息 消息队列
  • 聚类算法应用场景实例十则

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 基于用户位置信息的商业选址 随着信息技术的快速发展 移动设备和移动互联网已经普及到千家万户 在用户使用移动网络时 会自然的留下用户的位置信息 随着近年来GIS地理信息技
  • vue3 webpack打包流程及安装 (1)

    npm run build 也可以打包 如果没有特殊需求 可以使用 效果其实是差不多的 webpack网址 起步 webpack 中文文档 docschina org 报错 跟着安装报错 后来查了才知道 是因为 webpack 版本有问题
  • 多相机坐标转换_使用KITTI数据集实现坐标转换

    本文的主要内容 是讨论如何将KITTI激光雷达的点云数据 映射到图像中去 KITTI数据集是怎么采集的 下面这幅图是车的俯视图 可以看到 用到了2个彩色相机 2个灰度相机 1个激光雷达 1个GPS IMU 图1 KITTI车俯视图 KITT
  • UiBot RPA:电商决胜双11的秘密武器

    近年来 中国网络零售市场规模持续扩大 数据显示 2019年前三季度 全国网上零售额73237亿元 同比增长16 8 其中 实物商品网上零售额57777亿元 增长20 5 占社会消费品零售总额比重的19 5 然而 在规模增长的同时 中国网购交

随机推荐

  • 关于图像处理中的卷积运算——sobel边缘检测

    一 卷积的概念以及计算 1 一维卷积 在泛函分析中 卷积是通过两个函数 f 和 g 生成第三个函数的数学运算 表征函数 f 和经过翻转 平移的g 的乘积函数围成的曲边梯形的面积 连续函数卷积 设 f x g x 是 R 上两个可积函数 作积
  • 查询和设置服务器最小最大内存

    exec sp configure show advanced option 1 reconfigure exec sp configure max server memory MB 显示服务器最大内存 exec sp configure
  • 2021年浙大考研计算机专业录取分数线,浙江大学2021年计算机考研拟录取数据分析...

    导语 中公浙江研招网提醒大家关注浙江专业解析 浙江大学2021年计算机考研拟录取数据分析 浙江大学计算机科学与技术399分的分数线堪称恐怖 这仅仅是进入复试的条件 复试录取比一般要求不低于1 2 1 也就是说 必然会有400分以上的高分考生
  • C++入门day07(通讯录)

    C 语句真的好长啊 Python确实更简洁 老师带着我们理解逻辑 所以用的是面条版 通讯录管理系统 系统需求 通讯录是一个可以记录亲人 好友信息的工具 系统中需要实现的功能如下 添加联系人 向通讯录中添加新人 信息包括 姓名 性别 年龄 联
  • feign.RetryableException:&& unknowhostException

    在使用springcloud的时候 服务的调用通过eureka来保存 通过feign来进行微服务的远程调用 在远程调用ribbon的时候 出现两种异常 一种是timeout异常 需要在配置中加上ribbon ReadTimeout 6000
  • windows10和win11设置暂停更新-时间任意设置

    windows10设置暂停更新时间任意设置 亲测有效 1 修改注册表 2 设置时间参数 2 1 设置路由 2 2 设置参数 2 3 设置后效果 1 修改注册表 找到Windows 管理工具 点击向下可找到注册表编辑器 点击打开 打开 运行
  • uni-app h5 uploadFile多文件/图片上传

    问题描述 在使用uni app开发h5时要实现多图片上传给后台 不使用循环 发现给后台的格式有误 后台取不到数据 需改变下传递的数据格式 uni chooseImage sourceType sourceType this sourceTy
  • idea新建一个Spring项目(最基础)

    首先 笼统介绍一下 什么是spring 1 Spring 的主要作用就是为代码 解耦 降低代码间的耦合度 根据功能的不同 可以将一个系统中的代码分为主业务逻辑与系统级业务逻辑两类 它们各自具有鲜明的特点 主业务代码间逻辑联系紧密 有具体的专
  • 【MAVEN】Maven依赖和项目代码分离打包,依赖包自动同步到服务器

    Maven分离lib打包 lib包自动同步 加速项目部署 目标 整体步骤 Maven配置 1 分离打包 配置打包 将依赖jar拷贝到外部 2 编辑MANIFEST MF 本地 lt gt 服务器lib快速同步 1 使用前提 2 实现同步 目
  • R语言 编写自定义函数

    自定义函数 R语言实际上是函数的集合 用户可以使用base stats等包中的基本函数 也可以编写自定义函数完成一定的功能 一个函数的结构大致如下所示 myfunction lt function arglist statements re
  • 网络数据保障ptop_网络影响未来十大预言

    2007年1月23日 CNNIC发布了第19次互联网报告 报告数据显示 中国的互联网正在很多方面发生改变 2007年这一趋势将变得更加明显 1 网络越来越实用 56 1 的用户上网经常收发邮件 上网看新闻第一次退居次席 估计不远的将来 写信
  • 【邻接表】69 邻接表:构造有权图

    问题描述 目的 使用C 模板设计并逐步完善图的邻接表抽象数据类型 ADT 内容 1 请参照图的邻接矩阵模板类原型 设计并逐步完善图的邻接表ADT 由于该环境目前仅支持单文件的编译 故将所有内容都集中在一个源文件内 在实际的设计中 推荐将抽象
  • JVM 虚拟机

    JDK1 2 Exact VM虚拟机优化 能够准确的判断内存中数时执行内存引用还是整数值 从而减少了句柄的中间开销 提高了熟读 Exact VM因它使用准确式内存管理 Exact Memory Management 也可以叫Non Cons
  • 内连接、外连接、左连接、右连接

    连接是使用一定条件将两个表合在在一起的操作 包括内连接 inner join 和外连接 outer join 1 内连接 等值连接 两个表中都满足相关条件的记录才被选择出来 2 外连接包括左外连接 左连接 left join 和右外连接 右
  • 美国一桶牛奶多少钱?

    你好 我是郭震 zhenguo 最近 关注我的朋友中有几位 想叫我多分享下美国的生活 今天我就从一个很小的生活点入手 牛奶 开始 牛奶在美国超市一般都是下面的这种大桶 比如Costco超市里 一般提供以下两种 口感有些不同 但是价格很相似
  • JAVA学习经验谈

    本文是我自2002年9月开始JAVA学习以来的一点经验之谈 首先我不是有丰富编程经验的程序员 所以本文不对JAVA的具体语法 编程技巧和设计模式做过多的论述 仅从个人的学习角度谈感受 由于有大学期间的C语言学习经历我对JAVA的基本语法相对
  • The Difference between Probability and Statistic

    本科数学专业 现在在PKU学习计算机 当前主要的focus是DNN RNN in Action Recognition 心中总有一股数学情结 OOAD 课程上老师提及这个问题 所以信誓旦旦地想写一篇博客 可惜最后发现雷声大 雨点小 先mar
  • 使用IDEA 对springboot项目进行打war包

    网上很多版本 以下是本人新建springboot项目后本地测试通过 好了上步骤 1首先这个地方需要配置
  • 多媒体讲解器基本型设计

    多媒体讲解器功能按照播放器功能和灯光控制功能分类 播放功能分类 简易型 具备按键操作功能 TF卡升级 在线播放 U盘升级 在线播放 具备人体接近检测功能 红外 雷达 自动播放讲解功能 自动停止讲解功能 自动播放音乐 自动切换到讲解功能 切换
  • Dart 断言(assert)和异常

    一 断言 assert 断言的作用是 如果表达式的求值结果不满足需要 则打断代码的执行 可以要将提示消息附加到断言 添加一个字符串作为第二个参数 实例 void main String urlString http www baidu co