Flutter开发进阶之错误信息
在Flutter开发中错误信息通常是由Exception和Error表示,Error表示严重且不可恢复的错误,一般会导致程序直接终止,而Exception可以被显式抛出,一般为代码逻辑错误,根据Flutter的解释说Exception为异常而Error为错误。
本文将通过源码和实际操作来比较Exception和Error的异同。
介绍比对
('flutter:keep-to-string-in-subtypes')
abstract interface class Exception('flutter:keep-to-string-in-subtypes')
class Error
@pragma('flutter:keep-to-string-in-subtypes')
是一个特殊的注解(annotation
),它用于指导Flutter的Dart编译器在编译时保留某些类型信息。
具体来说,这个注解是为了确保当类型被用作其他类型的子类型时,其字符串表示形式(通常是类型名称)会被保留在生成的代码中。
Exception是一个抽象类,一般需要通过指定的类型去使用,例如
class FormatException implements Exception
处理的是字符串类型的异常。
Exception
还有
("Use UnsupportedError instead")
class IntegerDivisionByZeroException implements Exception, UnsupportedError
现已废弃,开始采用UnsupportedError
。
对于Error
,源码中的注释相对于Exception
要严重的多,程序员应该避免其出现在测试以外。
其类型有
class AssertionError extends Errorclass TypeError extends Errorclass ArgumentError extends Errorclass RangeError extends ArgumentErrorclass IndexError extends ArgumentError implements RangeErrorclass NoSuchMethodError extends Error("vm:entry-point")
class UnsupportedError extends Errorclass UnimplementedError extends Error implements UnsupportedErrorclass ConcurrentModificationError extends Errorfinal class OutOfMemoryError implements Errorfinal class StackOverflowError implements Error
名称很直白,很容易就知道具体是什么错误。
使用比对
try {///} on FormatException {///} catch(e, s) {///} finally {///}
通过try
可以执行一些可能抛出异常的方法,可以通过on
可以对指定类型的异常进行对应处理,catch
会收到对应的错误,无论代码是否异常最后都会执行finally
。
FormatException
还可以自定义类型,比如我们在进行数据请求时就是通过自定义异常类型去处理异常。
可以通过throw const FormatException('xxxxx');
主动抛出异常,还可以通过rethrow;
进行异常重抛。
异常的收集需要在WidgetsFlutterBinding.ensureInitialized()
执行之后。
主动抛出的错误也是可以通过throw
来执行,对于Flutter的错误可以通过
FlutterError.onError = (e) {FlutterError.presentError(e);};
来收集。
对于异步的错误可以通过
PlatformDispatcher.instance.onError = (error, stack) {myBackend.sendError(error, stack);return true;};
来收集,或者通过
R? runZonedGuarded<R>(R body(), void onError(Object error, StackTrace stack),{Map<Object?, Object?>? zoneValues, ZoneSpecification? zoneSpecification})
来处理。