首页 > 其他分享 >Flutter/Dart第13天:Dart错误处理

Flutter/Dart第13天:Dart错误处理

时间:2023-10-15 16:55:22浏览次数:33  
标签:13 抛出 捕获 Dart print catch 错误处理 异常

Dart官方文档:https://dart.dev/language/error-handling

重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。

异常

和Java一样,Dart也可以抛出异常,也可以捕获异常。Dart异常如果未被捕获,容易导致进程挂起和导致程序退出。所以,我们在编写Dart程序时,需要特别关注异常。

和Java不同的是,Dart中的异常全部都是未检测异常。如果一个方法没有申明任何类型的异常,那么我们就无需捕获该方法的异常。

Dart提供了ExceptionError两种异常的基础类型,同时内置了其他一些它们的子类。我们也可以定义我们自己的异常类型,Dart可以把任何非空的对象当作异常抛出,且这些对象类型不一定是ExceptionError类型的子类(和Java有很大区别)。

throw抛出异常

Dart可以把任务非空对象当作异常抛出,但建议抛出的异常为Exception或者Error的子类,下面是几个代码样例:

throw FormatException('Expected at least 1 section');

throw 'Out of llamas!';

void distanceTo(Point other) => throw UnimplementedError();

catch捕获异常

捕获异常,一般有种目的:一是为了阻止异常继续传播,二是我们期望重新抛出异常。

捕获异常的语法有几种:

  • on 异常类型 catch(异常对象)
  • catch(异常对象)
  • catch(异常对象, 异常堆栈)

捕获异常后,我们可以进行一些处理。我们可以根据异常类型,捕获多个异常。异常语句中若未定义异常类型,则捕获所有异常,如下代码样例:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // `OutOfLlamasException`类型的异常
  buyMoreLlamas();
} on Exception catch (e) {
  // `Exception`类型的异常
  print('Unknown exception: $e');
} catch (e) {
  // 其他的所有的异常
  print('Something really unknown: $e');
}

异常堆栈类型StackTrace类型,如下代码样例:

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}

rethrow重新抛出异常

如下代码样例,当捕获到异常之后,可以通过rethrow重新抛出异常:

void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // 制造异常
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // 重新抛出异常
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

finally子句

当我们不论是否有异常发生,都行执行某个逻辑时,我们可用使用finally子句。当发生异常时,首先执行catch子句进行捕获,若未被捕获或者重新抛出异常,那么这个异常会在执行完fianlly之后被抛出。

try {
  breedMoreLlamas();
} finally {
  // 不论是否有异常发生,均会执行本逻辑
  cleanLlamaStalls();
}

try {
  breedMoreLlamas();
} catch (e) {
  // 首先:捕获异常
  print('Error: $e');
} finally {
  // 然后:执行本逻辑
  cleanLlamaStalls();
}

断言

在应用的开发阶段,通过结果为false的断言语句(如:assert(<condition>, <optionalMessage>);语句)来阻断程序执行。几种断言语句的代码样例:

// `text`不能为null
assert(text != null);

// `number`必须小于100
assert(number < 100);

// `urlString`必须以`https`开头
assert(urlString.startsWith('https'), 'URL ($urlString) should start with "https".');

断言失败(表达式结果为false)时,抛出AssertionError类型(Error类型的子类)的异常。

断言在以下场景下会生效:

  • Flutter应用程序在debug模式(开发阶段,开启了断言)。
  • 类似于webdev等开发工具,默认开启了断言。
  • 类似于dart rundart compile js等工具,且通过命令行增加了--enable-asserts开启断言参数。

而在生产阶段,断言相关代码被忽略,因此断言会失效(不会执行)。


我的本博客原地址:https://ntopic.cn/p/2023101401


标签:13,抛出,捕获,Dart,print,catch,错误处理,异常
From: https://www.cnblogs.com/obullxl/p/NTopic2023101401.html

相关文章

  • 2023-2024-1 20231308 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231308《计算机基础与程序设计》第三周学习总结作业信息作业课程2023-2024-1-计算机基础与程序设计作业要求2023-2024-1计算机基础与程序设计第三周作业作业目标自学《计算机科学概论》第2章,第3章,《C语言程序设计》第2章作业正文https://www.c......
  • 2023-2024-1 20231326 《计算机基础与程序设计》第三周周总结
    2023-2024-120231326《计算机基础与程序设计》第三周周总结目录2023-2024-120231326《计算机基础与程序设计》第三周周总结作业信息教材内容总结《计算机科学概论》《C语言程序设计》学习进度条作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这......
  • 2023-2024-1 20211319《计算机基础与程序设计》第三周学习总结
    2023-2024-120211319《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标<写上具体方面>作业正文......
  • 2023-2024-1 20231309 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231309《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第三周作业这个作业的目标作业正文2023-2024-120231309《计算机基础......
  • 2023-2024-1 学号20231303 《计算机基础与程序设计》赵泊瑄第三周学习总结
    2023-2024-1学号20231303《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程如2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接如2023-2024-1计算机基础与程序设计第三周作业)这个作业的目标总结第三周学习收获作业正......
  • 2023-2024-1 20231314 许城铭 《计算机基础与程序设计》第3周学习总结
    2023-2024-120231314许城铭《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第三周作业)这个作业的目标<自学教材:计算......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记5
    20211306密码系统设计与实现课程学习笔记5任务详情自学教材第11章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 2023-2024-1 20231327 司宏林 《计算机基础与程序设计》第3周学习总结
    学期(2023-2024-1)学号(20231327)《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第3周作业)这个作业的目标<写上具体方面>......
  • 升级Lync Server 2013到Skype for Business 2019(十一)
    写在前面本章将介绍如何将LyncServer2013旧有边缘服务,切换到新的SkypeforBusiness2019边缘服务器上。切换SkypeforBusiness2019服务器添加SkypeforBusiness2019服务器公网DNS。这些DNS主要包括如下内容:项目DNS配置类型IP外部访问access.contoso.comA公网IP地址外部Web会......
  • 力扣---137. 只出现一次的数字 II
    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例1:输入:nums=[2,2,3,2]输出:3示例2:输入:nums=[0,1,0,1,0,1,99]......