Flutter学习笔记11:Dart异常

异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。

Dart 代码可以抛出和捕获异常。 和 Java 有所不同, Dart 中的所有异常是非检查异常。 方法不会声明它们抛出的异常, 也不要求捕获任何异常。

Dart 提供了 Exception 和 Error 类型, 以及一些子类型。 当然也可以定义自己的异常类型。 但是,此外 Dart 程序可以抛出任何非 null 对象, 不仅限 Exception 和 Error 对象。

高质量的生产环境代码通常会实现 Error 或 Exception 类型的异常抛出。

关键字Throw抛出异常:

void throwInfo (String msg){
  if(msg == null){    
  	throw FormatException('Expected at least 1 section');  
  }
}

当然我们也可以抛出任意的对象:

void throwInfo (String msg){
  //当然我们也可以抛出任意的异常。
  if(msg == null){    
  	throw 'Out of llamas!';  
  }
}

另外,当我们抛出多个异常的时候,只有第一个异常有效,之后的异常都会被置灰无效:
Flutter学习笔记11:Dart异常_第1张图片

关键字Catch捕获异常:

捕获异常可以避免异常继续传递(除非重新抛出( rethrow )异常)。 可以通过捕获异常的机会来处理该异常:

——on可以捕获到某一类的异常,但是获取不到异常对象;
——catch可以捕获到异常对象。这个两个关键字可以组合使用;
——rethrow可以重新抛出捕获的异常。

void catchInfo() {
  try {
    //TODO:
  } on FormatException catch (e) {
    // 如果匹配不到FormatException,则会继续匹配
    print("catch format exception");    
    print(e);    
    rethrow; // 重新抛出异常
  } on Exception {
    // 匹配不到Exception,会继续匹配
    print("catch exception");
  } catch (e, r) {
    // 匹配所以类型的异常. e是异常对象,r是StackTrace对象,异常的堆栈信息
    print(e);
  }
}

如上述代码所示,捕获语句中可以同时使用 on 和 catch ,也可以单独分开使用。 使用 on 来指定异常类型, 使用 catch 来 捕获异常对象。

catch() 函数可以指定1到2个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 ( 一个 StackTrace 对象 )。

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

如果仅需要部分处理异常, 那么可以使用关键字 rethrow 将异常重新抛出。

关键字Finally

不管是否抛出异常, finally 中的代码都会被执行。 如果 catch 没有匹配到异常, 异常会在 finally 执行完成后,再次被抛出,这一点与Java完全相同的。

try {  
	print('TODO Sth');		
} finally {  
	//TODO:	
}

任何匹配的 catch 执行完成后,再执行 finally :

try {   
	//TODO:   
} catch (e) {   
	print('Error: $e');   
} finally {   
	print('TODO Sth');   
}

抛出特定于应用程序的异常是指示发生错误的常用方法。您可以通过实现Exception接口来定义自定义异常:

class CustomException implements Exception{
  final String msg = 'hjk';  
  const CustomException([msg]);
  @override
  String toString() {    
  	return super.toString();  
  }
}

你可能感兴趣的:(Flutter)