网站开发的设计思路微信公众平台小程序是什么
news/
2025/9/23 1:15:18/
文章来源:
网站开发的设计思路,微信公众平台小程序是什么,网络规划设计师报考,北京朝阳区房价2022最新价格简介#xff1a;应用性能稳定是良好用户体验中非常关键的一环#xff0c;为了更好保障应用性能稳定#xff0c;异常捕获在保证线上产品稳定中扮演着至关重要的角色。我们团队在推出了U-APM移动应用性能监控的产品后#xff0c;帮助开发者定位并解决掉很多线上的疑难杂症。随…简介应用性能稳定是良好用户体验中非常关键的一环为了更好保障应用性能稳定异常捕获在保证线上产品稳定中扮演着至关重要的角色。我们团队在推出了U-APM移动应用性能监控的产品后帮助开发者定位并解决掉很多线上的疑难杂症。随着使用人数的增多关注度的提高在拜访客户和开发者的留言中很多开发者都提出希望该产品可以支持flutter框架的异常捕获。本身我并没有做过flutter开发所以主要是通过在现有产品能力基础上做插件实现异常的上报这篇文章就记录我学习flutter错误处理的过程和遇到的问题。
作者友盟技术专家 彦克
一、背景
应用性能稳定是良好用户体验中非常关键的一环为了更好保障应用性能稳定异常捕获在保证线上产品稳定中扮演着至关重要的角色。我们团队在推出了U-APM移动应用性能监控的产品后帮助开发者定位并解决掉很多线上的疑难杂症。随着使用人数的增多关注度的提高在拜访客户和开发者的留言中很多开发者都提出希望该产品可以支持flutter框架的异常捕获。本身我并没有做过flutter开发所以主要是通过在现有产品能力基础上做插件实现异常的上报这篇文章就记录我学习flutter错误处理的过程和遇到的问题。
二、Flutter异常
Flutter 异常指的是Flutter 程序中 Dart 代码运行时意外发生的错误事件。
三、Flutter异常特点
Dart是单进程机制所以在这个进程中出现问题时仅仅会影响当前进程Dart 采用事件循环的机制来运行任务当某个任务发生异常并没有被捕获时程序并不会退出而直接导致的结果是当前任务的后续代码就不会被执行了也就是说一个任务中的异常是不会影响其它任务执行的各个任务的运行状态是互相独立的。
如我们可以通过与 Java 类似的 try-catch 机制来捕获它。但与 Java 不同的是Dart 程序不强制要求我们必须处理异常。
四、Flutter异常分类
在Flutter开发中根据异常来源的不同可以将异常分为Framework异常和App异常。Flutter对这两种异常提供了不同的捕获方式Framework异常是由Flutter框架引发的异常通常是由于错误的应用代码造成Flutter框架底层的异常判断引起的。而对于App异常就是应用代码的异常通常由未处理应用层其他模块所抛出的异常引起。根据异常代码的执行时序App 异常可以分为两类即同步异常和异步异常。
五、捕获方式
1.App 异常的捕获方式
捕获同步异常使用try-catch 机制
// 使用 try-catch 捕获同步异常
try { throw StateError(This is a Dart exception.);
}
catch(e) { print(e);
}
捕获异步异常使用Future 提供的 catchError 语句
// 使用 catchError 捕获异步异常
Future.delayed(Duration(seconds: 1)) .then((e) throw StateError(This is a Dart exception in Future.)) .catchError((e)print(e));
看到这里估计很多人心里会问就不能有一种方式既可以监控同步又可以监控异步异常吗
答案是有的。
Flutter 提供了 Zone.runZoned 方法来管理代码中的所有异常。我们可以给代码执行对象指定一个Zone在 Dart 中Zone 表示一个代码执行的环境范围其概念类似沙盒不同沙盒之间是互相隔离的。如果我们想要观察沙盒中代码执行出现的异常沙盒提供了 onError 回调函数拦截那些在代码执行对象中的未捕获异常。废话不多说
Show me the code
runZoned(() { // 同步异常 throw StateError(This is a Dart exception.);
}, onError: (dynamic e, StackTrace stack) { print(Sync error caught by zone);
});
runZoned(() { // 异步异常 Future.delayed(Duration(seconds: 1)) .then((e) throw StateError(This is a Dart exception in Future.));
}, onError: (dynamic e, StackTrace stack) { print(Async error aught by zone);
});
为了能够集中捕获 Flutter 应用中的未处理异常最终我把main函数中的 runApp 语句也放置在 Zone 中。这样在检测到代码中运行异常时就能根据获取到的异常上下文信息进行统一处理了
runZoned(() async { runApp(MyApp());
}, onError: (error, stackTrace) async {
//Do sth for error
});
2.Framework异常捕获方式
Flutter 框架为我们在很多关键的方法进行了异常捕获。如果我们想自己上报异常只需要提供一个自定义的错误处理回调即可如
void main() { FlutterError.onError (FlutterErrorDetails details) { reportError(details); };
...
}
有没有一套从天而降的代码能够统一处理以上异常呢
3.总结一套代码捕获所有异常
runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError (FlutterErrorDetails details) { myErrorsHandler.onError(details.exceptiondetails.stack); }; runApp(MyApp()); }, (Object error, StackTrace stack) { myErrorsHandler.onError(error, stack); });
代码中出现了一句上诉从没有出现过的代码即WidgetsFlutterBinding.ensureInitialized()当我把这行代码注释掉的时候框架异常是捕获不到的。
当时困扰了好久最后终于查到了原因 上图是Flutter的架构层WidgetFlutterBinding用于与 Flutter 引擎交互。 我们的APM产品需要调用 native 代码来初始化并且由于插件需要使用平台 channel 来调用 native 代码这是异步完成的因此必须调用ensureInitialized()确保你有一个 WidgetsBinding 的实例.
来自 docs :
Returns an instance of the WidgetsBinding, creating and initializing it if necessary. If one is created, it will be a WidgetsFlutterBinding. If one was previously initialized, then it will at least implement WidgetsBinding.
注如果你的应用在runApp 中调用了 WidgetsFlutterBinding.ensureInitialized() 方法来进行一些初始化操作则必须在runZonedGuarded中调用WidgetsFlutterBinding.ensureInitialized()
六、异常上报
异常上报的整体方案是通过已有的插件增加接口桥接Android APM 和 iOS APM库的自定义异常上报接口。
插件增加函数
static void postException(error, stack) { List args [error,stack]; //将异常和堆栈上报至umapm _channel.invokeMethod(postException,args); }
Android 端调用自定义异常上报
private void postException(List args){ String error (String)args.get(0); String stack (String)args.get(1); UMCrash.generateCustomLog(stack,error); }
iOS端调用自定义异常上报
if ([postException isEqualToString:call.method]){ NSString* error arguments[0]; NSString* stack arguments[1]; [UMCrash reportExceptionWithName:Flutter reason:error stackTrace:stack terminateProgram:NO];
}
以上就是本期干货内容的介绍希望我们的技术内容可以更好地帮助开发者们解决问题我们将陪伴开发者们一起进步一起成长。
原文链接 本文为阿里云原创内容未经允许不得转载。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910972.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!