Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В меньшем количестве библиотек есть и свои плюсы, например, вам нужно рассмотреть меньше разных вариантов чтобы подобрать именно тот, что подойдёт вашему проекту.
Довольно просто дебажить даже асинхронный код — благодаря зонам, если обернуть асинхронный кусок в Chain.capture из пакета stack_trace, то можно получить нормальный читаемый стек трейс даже в коде, состоящем из одних коллбеков и футур— можно сделать?
import 'package:stack_trace/stack_trace.dart';
import 'dart:async';
Future<Null> blah() async {
throw 'foo';
}
void main() async {
var result = await new Future(() async {
await new Future(() async {
await blah();
});
});
}
Unhandled exception: Uncaught Error: foo Stack Trace: #0 blah.<blah_async_body> (file:///Users/anton/projects/mixbook/photo_prints_web/blah.dart:7:3) #1 Future.Future.microtask.<anonymous closure> (dart:async/future.dart:144) #2 _microtaskLoop (dart:async/schedule_microtask.dart:43) #3 _microtaskLoopEntry (dart:async/schedule_microtask.dart:52) #4 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394) #5 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414) #6 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148) #0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:895) #1 _microtaskLoop (dart:async/schedule_microtask.dart:43) #2 _microtaskLoopEntry (dart:async/schedule_microtask.dart:52) #3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394) #4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414) #5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
blah() когда случилось исключение. Но если мы это обернем в Chain.capture:Future<Null> blah() async {
throw 'foo';
}
void main() {
Chain.capture(() async {
var result = await new Future(() async {
await new Future(() async {
await blah();
});
});
}, onError: (error, chain) {
print(chain.terse);
});
}
blah.dart 7:3 blah.<async> ===== asynchronous gap =========================== dart:async _Completer.completeError blah.dart 10:1 blah.<async> ===== asynchronous gap =========================== dart:async Future.Future.microtask blah.dart blah blah.dart 14:15 main.<fn>.<async>.<fn>.<async>.<fn>.<async> ===== asynchronous gap =========================== dart:async Future.Future blah.dart 13:17 main.<fn>.<async>.<fn>.<async> ===== asynchronous gap =========================== dart:async Future.Future blah.dart 12:28 main.<fn>.<async> ===== asynchronous gap =========================== dart:async Future.Future.microtask blah.dart main.<fn> package:stack_trace Chain.capture blah.dart 11:9 main
Нужен ли мне Dart?