【发布时间】:2023-02-22 10:51:53
【问题描述】:
我目前正在使用 Flutter 开发移动应用程序。我问自己是否有可能将我的整个应用程序包装在一个 try/catch 中,并且当发生一些我在编程时没有考虑的异常时向用户显示某种致命错误屏幕?
我知道这可能不被认为是好的做法,但是如果你们中的一些人能分享他们对这个话题的看法,我会很高兴。
我是编程思维并问自己上述问题。
【问题讨论】:
-
是的你可以。但你不应该,它不会工作。
我目前正在使用 Flutter 开发移动应用程序。我问自己是否有可能将我的整个应用程序包装在一个 try/catch 中,并且当发生一些我在编程时没有考虑的异常时向用户显示某种致命错误屏幕?
我知道这可能不被认为是好的做法,但是如果你们中的一些人能分享他们对这个话题的看法,我会很高兴。
我是编程思维并问自己上述问题。
【问题讨论】:
您将无法将整个应用程序包装在单个 try/catch 中,并且不能保证捕获所有可能导致应用程序崩溃的致命异常。虽然您可以将所有单独的代码段包装在 try/catch 块中,但您应该问问自己为什么这可能会有帮助。
异常可以为用户提供有用的信息。如果您正在进行网络调用并收到 HttpException,您可以通知用户发生了什么,并以某种方式填充他们的体验。如果你得到一个 IOException,他们可能没有互联网连接等。
如果异常的答案是将用户锁定在一般错误屏幕中,那么您还没有向用户提供任何关于可能出了什么问题的有用信息,此时唯一的行动方案是重新启动应用程序,如果它刚刚崩溃并重新启动,它会更快。
【讨论】:
是的你可以。但是具体怎么做,要视情况而定。有三种不同的方式(据我所知)。
对于完全同步代码的可执行文件,try/catch 就足够了:
void main() {
try {
_main();
}
catch (error) {
// do something with error
}
}
void _main() {
...
}
如果您的可执行文件使用任何异步操作,为了捕获未捕获的异步异常,您需要runZonedGuarded:
import 'dart:async';
void main() {
runZonedGuarded(
() => _main(),
(error, stackTrace) {
// do something with error
}
);
}
Future<void> _main() async {
...
}
Flutter 框架将使用 FlutterError.onError 作为例外:
import 'flutter:widgets.dart';
void main() {
FlutterError.onError = (FlutterErrorDetails details) {
// do something with error
};
runApp(MyAppWidget());
}
这有很多有效的用例,例如检测生产应用程序以跟踪野外的异常。
【讨论】: