Catch sync errors when using zone

This commit is contained in:
Tobe O 2018-08-20 21:12:12 -04:00
parent 340b08da1b
commit f8bca542c4
2 changed files with 21 additions and 3 deletions

View file

@ -1,11 +1,21 @@
import 'package:angel_container/mirrors.dart'; import 'package:angel_container/mirrors.dart';
import 'package:angel_framework/angel_framework.dart'; import 'package:angel_framework/angel_framework.dart';
import 'package:logging/logging.dart';
main() async { main() async {
var app = new Angel( var app = new Angel(
logger: Logger('angel'),
reflector: MirrorsReflector(), reflector: MirrorsReflector(),
); );
hierarchicalLoggingEnabled = true;
app.logger.onRecord.listen((rec) {
print(rec);
if (rec.error != null) print(rec.error);
if (rec.stackTrace != null) print(rec.stackTrace);
});
// Index route. Returns JSON. // Index route. Returns JSON.
app.get('/', (req, res) => res.write('Welcome to Angel!')); app.get('/', (req, res) => res.write('Welcome to Angel!'));

View file

@ -227,9 +227,17 @@ class AngelHttp {
req.container.registerSingleton<Zone>(zone); req.container.registerSingleton<Zone>(zone);
req.container.registerSingleton<ZoneSpecification>(zoneSpec); req.container.registerSingleton<ZoneSpecification>(zoneSpec);
// If a synchronous error is thrown, it's not caught by `zone.run`,
// so use a try/catch, and recover when need be.
try {
return zone.run(handle).whenComplete(() { return zone.run(handle).whenComplete(() {
res.dispose(); res.dispose();
}); });
} catch (e, st) {
zone.handleUncaughtError(e, st);
return Future.value();
}
} }
}); });
}); });