• Flutter开发进阶之错误信息


    Flutter开发进阶之错误信息

    在Flutter开发中错误信息通常是由Exception和Error表示,Error表示严重且不可恢复的错误,一般会导致程序直接终止,而Exception可以被显式抛出,一般为代码逻辑错误,根据Flutter的解释说Exception为异常而Error为错误。
    本文将通过源码和实际操作来比较Exception和Error的异同。
    Flutter开发进阶

    介绍比对

    ('flutter:keep-to-string-in-subtypes')
    abstract interface class Exception
    
    ('flutter:keep-to-string-in-subtypes')
    class Error
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @pragma('flutter:keep-to-string-in-subtypes') 是一个特殊的注解(annotation),它用于指导Flutter的Dart编译器在编译时保留某些类型信息。
    具体来说,这个注解是为了确保当类型被用作其他类型的子类型时,其字符串表示形式(通常是类型名称)会被保留在生成的代码中。
    Exception是一个抽象类,一般需要通过指定的类型去使用,例如

    class FormatException implements Exception
    
    • 1

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

    ("Use UnsupportedError instead")
    class IntegerDivisionByZeroException implements Exception, UnsupportedError
    
    • 1
    • 2

    现已废弃,开始采用UnsupportedError

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

    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
    
    ("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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

    使用比对

        try {
          ///
        } on FormatException {
          ///
        } catch(e, s) {
          ///
        } finally {
          ///
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过try可以执行一些可能抛出异常的方法,可以通过on可以对指定类型的异常进行对应处理,catch会收到对应的错误,无论代码是否异常最后都会执行finally
    FormatException还可以自定义类型,比如我们在进行数据请求时就是通过自定义异常类型去处理异常。
    可以通过throw const FormatException('xxxxx');主动抛出异常,还可以通过rethrow;进行异常重抛。
    异常的收集需要在WidgetsFlutterBinding.ensureInitialized()执行之后。
    主动抛出的错误也是可以通过throw来执行,对于Flutter的错误可以通过

        FlutterError.onError = (e) {
          FlutterError.presentError(e);
        };
    
    • 1
    • 2
    • 3

    来收集。
    对于异步的错误可以通过

      PlatformDispatcher.instance.onError = (error, stack) {
        myBackend.sendError(error, stack);
        return true;
      };
    
    • 1
    • 2
    • 3
    • 4

    来收集,或者通过

    R? runZonedGuarded<R>(R body(), void onError(Object error, StackTrace stack),
        {Map<Object?, Object?>? zoneValues, ZoneSpecification? zoneSpecification})
    
    • 1
    • 2

    来处理。

  • 相关阅读:
    Safran与是德科技合作为蔚来提供电动汽车中的5G和C-V2X连接测试
    2022年java开发面试题整理合集
    营销妙招:链动2+1渠道搭建团队裂变
    详解GMM高斯混合模型EM模型
    Web 后端的一生之敌:分页器
    在Windows安装Flutter
    知识变现海哥|如何运营一个培训类社群
    JS手机号码正则
    小块渲染VS渐进式渲染
    深入实现 MyBatis 底层机制的实现任务阶段 7- 实现动态代理 Mapper 的方法
  • 原文地址:https://blog.csdn.net/weixin_42979360/article/details/137437998