• 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

    来处理。

  • 相关阅读:
    LM393 电压比较器及其典型电路介绍
    口碑好的猫罐头有哪些?宠物店受欢迎的5款猫罐头推荐!
    通讯录-C/C++
    图片拼接:如何将一堆杂乱无章的图片变成一个有意义的、协调的整体
    c++11 智能指针 (std::shared_ptr)(四)
    Probuf定义详解
    使用patch-package保存node_modules包修改
    用于流动质押和收益生成的 Web3 基础设施
    力扣--深度优先算法/回溯算法77.组合
    判断多个多边形是否连通(方法一:原理)
  • 原文地址:https://blog.csdn.net/weixin_42979360/article/details/137437998