Dart 提供了 Exception 和 Error 类型, 以及一些它们的实现类,也可以自定义异常类。与Java不同,Dart的所有异常都是未经检查的异常,并且没有throws。
名称 | 说明 |
---|---|
DeferredLoadException | 延迟加载异常 |
FormatException | 格式异常 |
IntegerDivisionByZeroException | 整数除零异常 |
IOException | IO异常 |
IsolateSpawnException | 隔离产生异常 |
OSError | 操作系统异常 |
TimeoutException | 超时异常 |
名称 | 说明 | 名称 | 说明 |
---|---|---|---|
AbstractClassInstantiationError | 抽象类实例化错误 | NoSuchMethodError | 没有这个方法错误 |
ArgumentError | 参数错误 | NullThrownError | Null 错误 |
AssertionError | 断言错误 | OutOfMemoryError | 内存溢出错误 |
AsyncError | 异步错误 | RemoteError | 远程错误 |
CastError | Cast 错误 | StackOverflowError | 堆栈溢出错误 |
ConcurrentModificationError | 并发修改错误 | StateError | 状态错误 |
CyclicInitializationError | 周期初始错误 | TypeError | 类型错误 |
FallThroughError | Fall Through 错误 | UnimplementedError | 未实现的错误 |
JsonUnsupportedObjectError | json 不支持错误 | UnsupportedError | 不支持错误 |
Dart 语言所有异常都是非检查异常,即方法或代码块不一定要声明异常或捕获异常,编译器不会强制你添加Throw或者try/catch。
- // 抛出Exception 对象
- throw new IOException(‘IO异常');
-
- // 抛出Error 对象
- throw new TypeError();
-
- // 抛出任意非null对象
- throw '这是一个抛出异常';
(1) 可以通过try/on关键字捕获
当不需要获取异常对象的信息时可以使用try/on。
- try{
- throw new OutOfMemoryError();
- } on OutOfMemoryError{
- //todo
- }
(2) 可以通过try/catch捕获
- try{
- throw new OutOfMemoryError();
- } catch(e,s){ //e为异常信息,s为异常Stack Trace
- //todo
- }
(3) try/on/catch组合使用
- try{
- throw new OutOfMemoryError();
- } on OutOfMemoryError catch(e,s){ //e为异常信息,s为异常Stack Trace
- //todo
- }
(4) 多次try/catch
- try{
- throw new OutOfMemoryError();
- } on OutOfMemoryError catch(e,s){ //如何异常为该异常时,后面的IOException将不执行
- //todo
- } on IOException catch(e) {
- //todo
- }
无论有无异常都会执行finally代码块
- try{
- throw new OutOfMemoryError();
- } on OutOfMemoryError catch(e,s){
- //todo
- } finally {
- //todo
- }
所以我们在编码的时候,在可能会有异常的地方要注意阅读API文档,另外自己写的方法,如果有异常抛出,要在注释处进行声明。比如类库中的File
类其中一个方法注释:
- /**
- * Synchronously read the entire file contents as a list of bytes.
- *
- * Throws a [FileSystemException] if the operation fails.
- */
- Uint8List readAsBytesSync();