Dart异常处理

Dart汇总请点击这里

Exceptions

Dart 代码可以抛出和捕获异常。异常是指示发生意外情况的错误。如果未捕获异常,则引发异常的隔离(isolates)将被暂停,并且通常会终止隔离及其程序。

与 Java 不同,Dart 的所有异常都是未检查异常。方法不会声明它们可能抛出哪些异常,并且您不需要捕获任何异常。

Dart 提供ExceptionError 类型,以及许多预定义的子类型。当然,可以定义自己的异常。但是,Dart 程序可以将任何非空对象(不仅仅是 Exception 和 Error 对象)抛出为异常。

Throw

以下是抛出或引发异常的示例:

throw FormatException('Expected at least 1 section');

你也可以throw任意对象

throw 'Out of llamas!';

生产质量代码通常会抛出实现错误或异常的类型。

因为抛出异常是一个表达式,所以你可以在 => 语句中以及允许表达式的任何其他地方抛出异常:

void distanceTo(Point other) => throw UnimplementedError();

Catch

捕获异常会阻止异常传播(除非您重新抛出异常)。捕获异常使您有机会处理它:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

要处理可能引发多种类型异常的代码,可以指定多个 catch 子句。与抛出对象类型匹配的第一个 catch 子句处理异常。如果 catch 子句未指定类型,则该子句可以处理任何类型的抛出对象:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

如上述代码所示,您可以使用 oncatch 或两者。当您需要指定异常类型时,请使用 on。当异常处理程序需要异常对象时,请使用 catch

可以为 catch() 指定一个或两个参数。第一个是引发的异常,第二个是堆栈跟踪(StackTrace 对象)。

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}

要部分处理异常,同时允许其传播,请使用 rethrow 关键字。

void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // Runtime error
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // Allow callers to see the exception.
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

Finally

为了确保无论是否引发异常,某些代码都会运行,请使用 finally 子句。如果没有 catch 子句与异常匹配,则在 finally 子句运行后传播异常:

try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

finally 子句在任何匹配的 catch 子句之后运行:

try {
  breedMoreLlamas();
} catch (e) {
  print('Error: $e'); // Handle the exception first.
} finally {
  cleanLlamaStalls(); // Then clean up.
}

Assert

在开发过程中,使用 assert 语句assert(<condition>, <optionalMessage>);——如果布尔条件为假,则中断正常执行。

// Make sure the variable has a non-null value.
assert(text != null);

// Make sure the value is less than 100.
assert(number < 100);

// Make sure this is an https URL.
assert(urlString.startsWith('https'));

要将消息附加到断言,请添加一个字符串作为第二个参数assert (可以选择在后面加上逗号):

assert(urlString.startsWith('https'),
    'URL ($urlString) should start with "https".');

第一个参数assert可以是任何解析为布尔值的表达式。如果表达式的值为真,则断言成功并继续执行。如果为假,则断言失败并 AssertionError抛出异常( )。

断言到底什么时候起作用?这取决于你使用的工具和框架:

  • Flutter 在调试模式下启用断言。
  • 仅开发工具webdev serve通常默认启用断言。
  • 一些工具,例如dart rundart compile js通过命令行标志支持断言:--enable-asserts

assert在生产代码中,断言被忽略,并且不会评估参数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值