秒懂Flutter之Dart中如何处理异常(Exception)

导读:本篇文章讲解 秒懂Flutter之Dart中如何处理异常(Exception),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

[版权申明]非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/115583389
出自:shusheng007

概述

不知不觉使用Flutter已经5个月了,项目已经基本上告一段落了,所以是到了回头总结的时候了。任何事情只有不断学习,不断总结才能领先于你的同行…

今天准备总结一下dart中Exception相关的内容。由于我之前是惯用Java/Kotlin的,而dart中异常处理系统与其类似,所以我们对比Java来简单聊一下。

Dart的异常处理系统

Dart中异常处理系统整体来说还是try catch那一套。其与Kotlin一样不存在受检查的异常,也就是说所有方法都不强制用户处理异常。

Dart 中存在两个类表示程序中的异常

  • Exception
abstract class Exception {
  factory Exception([var message]) => _Exception(message);
}

其代表那些程序出现了我们没有预料到的问题,而且这个异常时有望恢复的。

例如我们将一个String转换为int,但是当字符串的格式不是整数时,转换就会失败,我们可以在捕获这个异常后将其设置0,使程序正常运行下去。

  • Error
class Error {
...
  external StackTrace? get stackTrace;
}

其表示那些程序员犯的错,根本无法或者应该通过程序的手段来恢复运行的错误。

例如:例如你尝试将一个不是json格式的字符串解析为Json对象,这就可以认为是一个错误,应当立即失败,通知程序员。

但令我困惑的是:Dart的异常除了上面两个类型以外,可以在程序中抛出任何对象,感觉这个设计太SB了,也许是我不够深入Dart吧,不理解这么做的原因,有知道的还请不吝赐教。

实践

  • 最完整的用法
try{
  ...
  //可能抛出异常的代码
} on Exception1 catch(e, stackTrace){
   //Exception1 类型的异常  
} on Exception2 catch(e, stackTrace){
   //Exception2 类型的异常  
}
...
catch (e, stackTrace){
  //除了上面已经catch过的所有异常
}finally {
  //最后一定会执行
}

上面的代码有点经验的都看的懂,异常是从上到下一级一级的被过滤,一旦被某一级catch住了就不会再进入下一级了。

其中catch中的e是捕获到的异常对象,stackTrace 是异常栈。

dart这套异常处理比较灵活,上面很多东西可以省略。

如果不需要异常对象和栈就可以省略catch, 如果不捕获具体的异常就可以省略掉整个on分支,如果只需要异常对象,不需要异常栈,则可以省略掉stackTrace参数。

  • 抛出任意对象
try{
    //这里可以抛出任何对象,我们在程序中不要这么做
    throw "我是一个异常";
} catch(e,stackTrace){
  
}
  • 捕获异常后重新抛出
try{
	try{
       int num= 100 ~/ 0;
	} 
	on IntegerDivisionByZeroException{
	   rethrow;
	}
}catch(e,stackTrace){
  //将捕获到内层重新抛出的异常
}

总结

对于惯用Java的同学来说,最不适应的还是变化。一会有,一会又没有,没个定数…从这里就可以看出Java为什么适合大型项目了,语法上限制的你死死的,任你水平再高,也展现不出奇技淫巧,所以菜鸟也可轻松看的懂,才能保证项目在后续迭代中不断扩大规模…

最后请小伙伴们不吝赐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14699.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!