是否存在异步错误的全局处理程序?

时间:2013-11-24 23:36:14

标签: dart

在老式的同步代码中,您可以始终通过将源代码封装到一个大的try catch块来确保您的程序不会完全崩溃,如下例所示:

try {
  // Some piece of code
} catch (e) {
  logger.log(e); // log error
}

但是在Dart中,使用FutureStream时,并不容易。以下示例将完全崩溃您的应用程序

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);
}

有没有办法防止不信任的代码破坏整个应用程序?像全局错误处理程序?

1 个答案:

答案 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回调处理,应用程序继续运行。