Flutter开发进阶之错误信息

Flutter开发进阶之错误信息

在Flutter开发中错误信息通常是由Exception和Error表示,Error表示严重且不可恢复的错误,一般会导致程序直接终止,而Exception可以被显式抛出,一般为代码逻辑错误,根据Flutter的解释说Exception为异常而Error为错误。

本文将通过源码和实际操作来比较Exception和Error的异同。

介绍比对

dart 复制代码
@pragma('flutter:keep-to-string-in-subtypes')
abstract interface class Exception

@pragma('flutter:keep-to-string-in-subtypes')
class Error

@pragma('flutter:keep-to-string-in-subtypes') 是一个特殊的注解(annotation),它用于指导Flutter的Dart编译器在编译时保留某些类型信息。

具体来说,这个注解是为了确保当类型被用作其他类型的子类型时,其字符串表示形式(通常是类型名称)会被保留在生成的代码中。

Exception是一个抽象类,一般需要通过指定的类型去使用,例如

dart 复制代码
class FormatException implements Exception

处理的是字符串类型的异常。
Exception还有

dart 复制代码
@Deprecated("Use UnsupportedError instead")
class IntegerDivisionByZeroException implements Exception, UnsupportedError

现已废弃,开始采用UnsupportedError

对于Error,源码中的注释相对于Exception要严重的多,程序员应该避免其出现在测试以外。

其类型有

dart 复制代码
class AssertionError extends Error

class TypeError extends Error

class ArgumentError extends Error

class RangeError extends ArgumentError

class IndexError extends ArgumentError implements RangeError

class NoSuchMethodError extends Error

@pragma("vm:entry-point")
class UnsupportedError extends Error

class UnimplementedError extends Error implements UnsupportedError

class ConcurrentModificationError extends Error

final class OutOfMemoryError implements Error

final class StackOverflowError implements Error

名称很直白,很容易就知道具体是什么错误。

使用比对

dart 复制代码
    try {
      ///
    } on FormatException {
      ///
    } catch(e, s) {
      ///
    } finally {
      ///
    }

通过try可以执行一些可能抛出异常的方法,可以通过on可以对指定类型的异常进行对应处理,catch会收到对应的错误,无论代码是否异常最后都会执行finally
FormatException还可以自定义类型,比如我们在进行数据请求时就是通过自定义异常类型去处理异常。

可以通过throw const FormatException('xxxxx');主动抛出异常,还可以通过rethrow;进行异常重抛。

异常的收集需要在WidgetsFlutterBinding.ensureInitialized()执行之后。

主动抛出的错误也是可以通过throw来执行,对于Flutter的错误可以通过

dart 复制代码
    FlutterError.onError = (e) {
      FlutterError.presentError(e);
    };

来收集。

对于异步的错误可以通过

dart 复制代码
  PlatformDispatcher.instance.onError = (error, stack) {
    myBackend.sendError(error, stack);
    return true;
  };

来收集,或者通过

dart 复制代码
R? runZonedGuarded<R>(R body(), void onError(Object error, StackTrace stack),
    {Map<Object?, Object?>? zoneValues, ZoneSpecification? zoneSpecification})

来处理。

相关推荐
devmoon15 小时前
在 Paseo 测试网上获取 Coretime:On-demand 与 Bulk 的完整实操指南
开发语言·web3·区块链·测试用例·智能合约·solidity
一起养小猫15 小时前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
hudawei99615 小时前
flutter和Android动画的对比
android·flutter·动画
kylezhao201915 小时前
C# 中的 SOLID 五大设计原则
开发语言·c#
全栈前端老曹15 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
一只大侠的侠15 小时前
Flutter开源鸿蒙跨平台训练营 Day7Flutter+ArkTS双方案实现轮播图+搜索框+导航组件
flutter·开源·harmonyos
凡人叶枫16 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
春日见16 小时前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设
锐意无限16 小时前
Swift 扩展归纳--- UIView
开发语言·ios·swift
低代码布道师16 小时前
Next.js 16 全栈实战(一):从零打造“教培管家”系统——环境与脚手架搭建
开发语言·javascript·ecmascript