我目前正在使用Flutter开发一个移动的应用程序,我问自己是否有可能将我的整个应用程序 Package 在一个try/catch中,当一些异常发生时,我在编程时没有考虑到会向用户显示某种致命错误屏幕?我知道这可能不被认为是好的做法,但是,如果你们中的一些人能分享他们对这个主题的看法,我会很高兴。我是programmind,问自己上面提到的问题。
p1tboqfb1#
你不能在一个try/catch中 Package 整个应用,也不能保证捕获所有可能导致应用崩溃的致命异常。虽然你可以在try/catch块中 Package 所有的代码段,但你应该问问自己为什么这样做会有帮助。异常可以为用户提供有用的信息。如果你正在进行网络呼叫,你得到了一个HttpException,你可以通知用户发生了什么,并以某种方式填充他们的体验。如果你得到了一个IOException,他们可能没有互联网连接,等等。如果对异常的回答是将用户锁定在一个一般性错误屏幕中,那么您就没有向用户提供任何有用的信息来说明可能发生了什么错误,此时唯一的操作过程就是重新启动应用程序,如果应用程序只是崩溃并重新启动,那么这样做会更快。
ffscu2ro2#
是的,你可以。但是怎么做要看情况而定。(据我所知)有三种不同的方法。
对于完全同步代码的可执行文件,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()); }
这方面有很多有效的用例,比如检测生产应用程序以跟踪异常。
2条答案
按热度按时间p1tboqfb1#
你不能在一个try/catch中 Package 整个应用,也不能保证捕获所有可能导致应用崩溃的致命异常。虽然你可以在try/catch块中 Package 所有的代码段,但你应该问问自己为什么这样做会有帮助。
异常可以为用户提供有用的信息。如果你正在进行网络呼叫,你得到了一个HttpException,你可以通知用户发生了什么,并以某种方式填充他们的体验。如果你得到了一个IOException,他们可能没有互联网连接,等等。
如果对异常的回答是将用户锁定在一个一般性错误屏幕中,那么您就没有向用户提供任何有用的信息来说明可能发生了什么错误,此时唯一的操作过程就是重新启动应用程序,如果应用程序只是崩溃并重新启动,那么这样做会更快。
ffscu2ro2#
是的,你可以。但是怎么做要看情况而定。(据我所知)有三种不同的方法。
1.同步代码
对于完全同步代码的可执行文件,try/catch就足够了:
2.异步代码
如果您的可执行文件使用任何异步操作,为了捕获未捕获的异步异常,您需要runZonedGuarded:
3.扑动
Flutter框架将使用FlutterError.onError处理异常:
这方面有很多有效的用例,比如检测生产应用程序以跟踪异常。