Dart基础语法<六> 异常

179 阅读2分钟
  1. Dart 提供了 ExceptionError 以及一些子类型,也支持自定义异常类型。
  2. 有别于Java Dart 异常属于非检查异常。方法不一定声明了所抛出的异常, 也不要求捕获任何异常。
  3. Dart 支持抛出任何非 null 对象作为异常,不仅限于实现了 Exception / Error 的对象。
  4. catch中无法指定具体异常类型,需要结合on来使用。
  5. 使用 rethrow 关键字可以把捕获的异常重新抛出。
  6. finally关键字的使用和Java 一致。
void f1() {
  throw Exception("Juice");
}

void main() {
  try {
    f1();
  } catch (e,s) {
    print(e.runtimeType);
    print(s.runtimeType);
    print(e);
  }
}

运行结果为_Exception _StackTrace Exception: Juice 区别于java 中的catch语句catch(Exception e)Dart指明对象的具体类型。e代表抛出的异常对象,s表示异常堆栈信息。(命名可以不用e s,不需要使用异常堆栈信息,也可以直接改为catch(e)

int f2(int i) {
  if (i == 1) {
    throw 300;
  } else if (i == 2) {
    throw "Juice";
  } else if (i == 3) {
    throw print;
  }
  return i;
}

void f3(int i) {
  try {
    int result = f2(i);
    print(result);
  } on int catch (e) {
    print("int");
  } on String catch (e) {
    print("String");
  } on Function catch (e) {
    e("Function");
  }
}

void main() {
  f3(1);
  f3(2);
  f3(3);
  f3(99);
}

f2方法输入值为1 2 3是分别抛出int String Function对象(非 Exception / Error 对象),其他时候正常返回值。 f3方法则是执行f2方法,捕获异常(结合on使用),并对响应异常进行操作。 输入值为1 时,抛出300,执行f3中捕获int对象操作,输出int 输入值为2 时,抛出字符串Juice,执行f3中捕获String对象操作,输出String 输入值为3 时,抛出方法print,执行f3中捕获Function对象操作(此时的对象e即为print方法),输出Function 输入值为99 时,正常执行,输出99