一架梯子,一头程序猿,仰望星空!

Dart 异常( Exception)


类似java, Dart也提供了异常处理机制,主要有两种异常类型Exception和Error,当然我们也可以继承这两种基础异常类型,然后自定义新的异常类型。

Exception是我们可以预知的错误,Error是程序错误。例如,调用函数参数错误。

提示:Dart语言的异常处理跟java不一样的地方是,不强制一定要捕获异常,函数也不需要定义自己可能会抛出什么异常。

1.抛出异常

使用throw 抛出异常,在Dart语言中我们可以抛出任何非null的对象,不一定是 Exception 和Error或者他们的子类。

例如:

// 直接抛出String对象
throw '欢迎访问www.tizi365.com';

提示:一般建议抛出Exception和Error,或者他们的子类。

抛出异常对象的例子:
throw Exception('参数错误!');

2.捕获异常(catch)

通过try/catch语句捕获异常例子:

try {
  // 业务代码
} on OutOfLlamasException { // 通过on 指定要拦截的异常类型
  // 处理异常1
} on Exception catch (e) { // 通过on 指定拦截的异常类型,通过 catch 捕获异常对象
  // 拦截所有Exception和他的子类抛出的异常。
  print('Unknown exception: $e');
} catch (e) { 
  // 没有指定异常类型,只是catch异常对象,那相当于捕获所有异常类型。
  print('Something really unknown: $e');
}

使用rethrow重新抛出异常

  try {
    dynamic foo = true;
    print(foo++); // 这里会产生Runtime error
  } catch (e) {
    print('捕获到的异常类型 ${e.runtimeType}.');
    rethrow; //重新把异常丢出去
  }

获取异常调用栈,捕获到异常的时候我们希望知道异常是什么地方丢出来的,可以通过catch的第二个参数获取调用栈。

try {
  // ···
}  catch (e, s) {
  print('异常信息:\n $e');
  print('调用栈信息:\n $s');
}

3.Finally

如果我们希望无论是否捕获到异常,都要执行一些操作。例如,关闭文件。可以使用finally

try {
  // 业务代码
} catch (e) { 
  print('Error: $e'); // 处理异常
} finally { // 无论是否捕获异常都会执行finally的代码
  cleanTask(); // 执行清理工作。
}