生命不可能有两次,但许多人连一次也不善于度过 —— 吕凯特
异常这个机制是必须存在的,大部分的高级语言都会带有的异常检查机制或者错误检查机制的,如果没有异常和错误检查机制的话,那么出现了问题那么程序就运行不了了,那岂不是很尴尬,或者如果出现了超时异常这种,如果有异常机制的话,那么就进行超时异常进行捕获之后再进行重试机制等等
Dart 代码可以抛出和捕获异常。 异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。和 Java 有所不同, Dart 中的所有异常是非检查异常。 方法不会声明它们抛出的异常, 也不要求捕获任何异常,Dart 提供了 Exception和 Error类型, 以及一些子类型。 当然也可以定义自己的异常类型。 但是,此外 Dart 程序可以抛出任何非 null对象, 不仅限 Exception 和 Error对象 Dart 核心库定义了很多公共的 异常和错误类。 异常通常是一些可以预见和预知的情况。 错误是无法预见或者预防的情况
下面是关于抛出或者引发异常的示例:
throw 异常类型;
也可以进行任何对象进行抛出
throw 'Out of llamas!';
高质量的生产环境代码通常会实现 Error或 Exception类型的异常抛出
捕获异常可以避免异常继续传递,可以通过 try catch进行捕获异常的机会来处理该异常,通过指定多个 catch语句,可以处理可能抛出多种类型异常的代码。
try {方法内容
} on 异常名称 {异常处理}
与抛出异常类型匹配的第一个 catch语句处理异常。 如果 catch语句未指定类型, 则该语句可以处理任何类型的抛出对象,捕获语句中可以同时使用 on和 catch,也可以单独分开使用。 使用 on 来指定异常类型, 使用 catch 来 捕获异常对象【这点和java不同,Java都是利用该catch进行异常捕获的】,catch() 函数可以指定1到2个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息
try {方法块
} on TimeOutException {// 一个特殊的异常异常处理
} on Exception catch (e) {// 其他任何异常print('Unknown exception: $e');
} catch (e,s) {// 没有指定的类型,处理所有异常,并打印堆栈信息print('Something really unknown: $e, stach :$s');
}
最终执行,不管是否抛出异常, finally 中的代码都会被执行【这一点和java一摸一样,不管什么情况都会执行finally语句块中的语法】。 如果 catch 没有匹配到异常, 异常会在 finally 执行完成后,再次被抛出
try {方法块
} finally {最终执行的语句
}
任何匹配的 catch 执行完成后,再执行 finally :
try {代码块
} catch (e) {异常捕获后进行处理
} finally {最终代码执行
}
要想进行彻底的学习的话,需要进行 dart:core 核心库的研究,他内部提供了很多的异常类型,当然了也可以自定义异常不过需要实现 Exception 接口
常见 Error
1.NoSuchMethodError【方法异常】
当方法的接受对象(可能为null)没有实现该方法时抛出。
2.ArgumentError【参数异常】
当方法在接受到一个不合法参数时抛出。
class 自定义异常名称 implements Exception {final String msg;const 自定义异常名称([this.msg]);@overrideString toString() => msg ?? '自定义异常名称';
}
Dart 提供的异常处理机制和其他大部分程序语言相同,还是挺健全的,这样方便了程序的开发和容错机制,大大的提供了程序的健壮性