在老式的同步代码中,您可以始终通过将源代码封装到一个大的try catch块来确保您的程序不会完全崩溃,如下例所示:
try {
// Some piece of code
} catch (e) {
logger.log(e); // log error
}
但是在Dart中,使用Future
和Stream
时,并不容易。以下示例将完全崩溃您的应用程序
try {
doSomethingAsync().then((result) => throw new Exception());
} catch (e) {
logger.log(e);
}
在try
- catch
块中包含代码并不重要。
是的,您可以随时使用Future.catchError
,遗憾的是,如果您使用第三方库功能,这对您无济于事:
void someThirdPartyDangerousMethod() {
new Future.value(true).then((result) => throw new Exception());
}
try {
// we can't use catchError, because this method does not return Future
someThirdPartyDangerousMethod();
} catch (e) {
logger.log(e);
}
有没有办法防止不信任的代码破坏整个应用程序?像全局错误处理程序?
答案 0 :(得分:5)
您可以使用全新的Zone
。只需在Zone
中运行代码并将错误处理程序附加到它。
void someThirdPartyDangerousMethod() {
new Future.value(true).then((result) => throw new Exception());
}
runZoned(() {
// we can't use catchError, because this method does not return Future
someThirdPartyDangerousMethod();
}, onError: (e) {
logger.log(e);
});
这应该按预期工作!每个未捕获的错误都将由onError
处理程序处理。有一点与使用try
- catch
块的经典示例不同。 Zone
内部运行的代码在发生错误时不会停止,错误由onError
回调处理,应用程序继续运行。