[版权申明]非商业目的注明出处可自由转载
出自: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为什么适合大型项目了,语法上限制的你死死的,任你水平再高,也展现不出奇技淫巧,所以菜鸟也可轻松看的懂,才能保证项目在后续迭代中不断扩大规模...
文章评论