📜  Dart的异常处理(1)

📅  最后修改于: 2023-12-03 15:30:22.455000             🧑  作者: Mango

Dart的异常处理

在Dart中,异常是指程序在执行时出现的错误或者异常情况。当异常发生时,程序可以通过异常处理机制来进行捕获和处理,以避免程序崩溃或产生不可预知的结果。本文将介绍Dart的异常处理机制。

异常的类型

Dart中的异常有两种类型:系统异常和用户异常。

系统异常是由Dart虚拟机抛出的异常,通常表示一些内部错误或逻辑异常,例如空指针异常、越界异常等等。用户异常是由应用程序代码主动抛出的异常,通常表示业务逻辑异常或操作失败。

异常处理语法

Dart提供了try-catch语句来捕获和处理异常。try语句用于包含可能引发异常的代码块,catch语句用于捕获try语句中抛出的异常。

下面是try-catch语句的基本语法:

try {
  //可能引发异常的代码块
} catch (exception) {
  //捕获并处理异常
}

其中,try语句中的代码块可能会抛出异常,catch语句中的参数exception表示捕获的异常对象。

需要注意的是,Dart中catch语句是按照异常类型匹配的,如果出现多个catch语句,程序会按照从上到下的顺序依次检查catch语句中的异常类型是否匹配抛出的异常。如果匹配成功,则执行匹配的catch语句;如果匹配不成功,则异常会继续向上抛出,直到有匹配的catch语句为止。

下面是一个简单的示例:

try {
  var list = [1, 2, 3];
  print(list[3]); //引发越界异常
} catch (exception) {
  print(exception.toString()); //打印异常信息
}

运行结果为:

RangeError (index): Invalid value: Not in range 0..2, inclusive: 3
捕获不同类型的异常

除了根据异常类型匹配的方式外,Dart还提供了一种更精细的方式来匹配不同类型的异常,这就是使用on关键字。

下面是on关键字的语法:

try {
  //可能引发异常的代码块
} on Exception1 {
  //捕获并处理Exception1类型的异常
} on Exception2 {
  //捕获并处理Exception2类型的异常
} catch (exception) {
  //捕获并处理其他类型的异常
}

在这种方式下,catch语句可以省略异常参数,因为异常类型已经在on语句中指定了。

下面是一个示例:

try {
  var num = 10 ~/ 0; //引发除以零异常
} on IntegerDivisionByZeroException {
  print("除数不能为零!");
} catch (exception) {
  print(exception.toString());
}

运行结果为:

除数不能为零!
finally语句

Dart还提供了finally语句来执行无论是否发生异常都要执行的代码。

下面是finally语句的语法:

try {
  //可能引发异常的代码块
} catch (exception) {
  //捕获并处理异常
} finally {
  //不管是否发生异常都要执行的代码
}

finally语句中的代码无论是否有异常都会执行,通常用于清理资源或者释放锁等操作。

下面是一个示例:

import 'dart:io';

void main() {
  final File file = File('example.txt');
  try {
    var contents = file.readAsStringSync(); //读取文件内容
    print(contents);
  } catch (exception) {
    print(exception.toString());
  } finally {
    //关闭文件资源
    file.closeSync();
  }
}

在这个示例中,我们打开一个文件并读取其内容,无论读取是否成功,都需要释放文件资源。

抛出异常

Dart中的异常不仅可以被捕获和处理,还可以被应用程序主动抛出。

下面是抛出异常的代码:

throw Exception("这是一个用户异常!");

抛出异常时,需要指定异常类型和异常信息。异常类型可以是任意类型,但通常应该使用Dart内置的异常类型,如Exception、ArgumentError、FormatException等等。

例如,在以下示例中,我们定义了一个函数用于计算两个数字的和,如果其中任意一个参数不是数字类型,就抛出一个FormatException异常。

int sum(num a, num b) {
  if(a is! num || b is! num) {
    throw FormatException("参数类型不正确!");
  }
  return a + b;
}

void main() {
  try {
    var result = sum(10, '20'); //调用sum函数,传入一个数字和一个字符串
    print(result);
  } catch(exception) {
    print(exception.toString()); //输出捕获的异常信息
  }
}

运行结果为:

FormatException: 参数类型不正确!
总结

异常处理机制是Dart语言提供的一个重要特性,它可以在程序运行时处理各种异常情况,避免程序崩溃或产生不可预知的结果。在本文中,我们介绍了Dart的异常类型、异常处理语法以及异常抛出机制,希望对大家有所帮助。