可以使用try catch 处理异常,也可以再次向上抛出
// 抛出一个异常实例 void testThrow() { throw Exception("异常发生"); } // 可以抛出一个任意对象 void testThrow2() { throw "抛出字符串也可以"; } void testThrow3() { try { testThrow(); } catch(e) { // 捕获到异常不处理,再次向上抛出 rethrow; } } void main() { try { testThrow(); } catch(e, s) { // 这里e是指抛出的异常类,s是堆栈信息 print(e is Exception); // true print(s); } try { testThrow2(); } catch(e) { print(e is Exception); // false print(e); // 抛出字符串也可以 } testThrow3(); // 这里有异常抛出,不捕获也是可以通过静态检查的 // 下面的语句无法执行 print("未捕获异常之后还能执行吗,不能"); } 异步编程dart提供了对异步的支持,核心类包括Future和Stream,都位于dart:async包下,这里介绍非常常用的Future.
Future被用来表示在未来才能知道其值或错误的一个类,和js中的Promise是类似的。
Future的创建
可以使用Future的构造方法创建Future
Future Future(FutureOr computation()) 可以异步的执行computation函数,其结果就是Future的结果
Future Future.delayed(Duration duration, [ FutureOr computation() ]) 延迟去执行里边的函数
Future Future.error(Object error, [ StackTrace stackTrace ]) 延迟抛出一个错误
Future.sync(FutureOr computation()) 立即执行
Future Future.microtask(FutureOr computation()) 以微任务方式执行
Future Future.value([FutureOr value ]) 参数是一个Future,直接以参数返回值为值作为返回Future的返回值
这几个构造方法使用比较简单,一下是简单示例
// 使用非命名构造 Future<String> getFuture() { return Future<String>(() { return "hello"; }); } // Future.delayed Future<String> getFuture2() { return Future.delayed(Duration(seconds: 2), () { return "Future.delayed"; }); } // Future.error Future<String> getFuture3() { return Future.error("错误对象"); } // Future.microtask Future<String> getFuture4() { return Future.microtask(() { return "Future.microtask"; }); } // Future.sync Future<String> getFuture5() { return Future.sync(() { return "Future.sync"; }); } Future.value(getFuture4());关于delayed, microtask,sync对比参见后文
Future 结果的获取
如果一个函数返回Future, 那么可以使用async await 获取其结果,可以使用try catch 捕获异常
可以使用.then获取正常结果,.catchError获取抛出的异常
import 'dart:async'; // 使用非命名构造 Future<String> getFuture() { return Future<String>(() { return "hello"; }); } void method1() { getFuture().then((res) { print(res); }).catchError((e) { print(e); }); print("后边的先执行了"); } void method2() async { String str = await getFuture(); print(str); print('按顺序执行'); } void main(){ method1(); method2(); // 输出 // 后边的先执行了 // hello // hello // 按顺序执行 }Future执行顺序比较
通过测试得出:
microtask 和async是写在前边的先执行
直接使用构造函数的在最后执行
delayed在microtask和async之后执行
关于这几者的比较,有兴趣的同学可以自行研究。
网络请求常用的发网络请求的方法有两种:
一是使用dart:io下的HttpClient
二是使用package:http/http.dart
HttpClient使用步骤:
创建HttpClient
[可选]配置HttpClient,比如设置超时时间,代理等
获取HttpClientRequest
[可选]设置httpClientRequest,如header
获取httpClientResponse
处理响应结果