Catch sync errors when using zone
This commit is contained in:
parent
340b08da1b
commit
f8bca542c4
2 changed files with 21 additions and 3 deletions
|
@ -1,11 +1,21 @@
|
|||
import 'package:angel_container/mirrors.dart';
|
||||
import 'package:angel_framework/angel_framework.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
main() async {
|
||||
var app = new Angel(
|
||||
logger: Logger('angel'),
|
||||
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.
|
||||
app.get('/', (req, res) => res.write('Welcome to Angel!'));
|
||||
|
||||
|
|
|
@ -227,9 +227,17 @@ class AngelHttp {
|
|||
req.container.registerSingleton<Zone>(zone);
|
||||
req.container.registerSingleton<ZoneSpecification>(zoneSpec);
|
||||
|
||||
return zone.run(handle).whenComplete(() {
|
||||
res.dispose();
|
||||
});
|
||||
// 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(() {
|
||||
res.dispose();
|
||||
});
|
||||
} catch (e, st) {
|
||||
zone.handleUncaughtError(e, st);
|
||||
return Future.value();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue