Flutter 什么';Dart中推荐的方法是:断言或抛出错误

Flutter 什么';Dart中推荐的方法是:断言或抛出错误,flutter,dart,Flutter,Dart,Dart明确区分了错误(表示代码逻辑中存在问题且永远不会发生且永远不会被捕获)和异常(表示基于运行时数据的问题) 我非常喜欢这种区别,但我想知道什么时候应该使用assert()函数?由于在生产模式中被忽略,您应该使用它们作为在调试模式下对代码逻辑进行初始测试的方法: 在生产代码中,将忽略断言,并且不会计算要断言的参数 断言什么时候起作用?这取决于您使用的工具和框架: 颤振在调试模式下启用断言。 默认情况下,只有开发工具(如dartdevc)才能启用断言。 有些工具,如dart和dart2js,通

Dart明确区分了错误(表示代码逻辑中存在问题且永远不会发生且永远不会被捕获)和异常(表示基于运行时数据的问题)

我非常喜欢这种区别,但我想知道什么时候应该使用
assert()
函数?

由于在生产模式中被忽略,您应该使用它们作为在调试模式下对代码逻辑进行初始测试的方法:

在生产代码中,将忽略断言,并且不会计算要断言的参数


断言什么时候起作用?这取决于您使用的工具和框架:

颤振在调试模式下启用断言。
默认情况下,只有开发工具(如dartdevc)才能启用断言。
有些工具,如dart和dart2js,通过命令行标志支持断言:--启用断言。
在生产代码中,将忽略断言,并且不会计算要断言的参数


请参阅:

断言是执行仅在开发中有用的代码的方法,而不会妨碍释放模式的性能–通常是为了防止类型系统中缺少功能导致的不良状态

例如,只有断言可以用于进行防御性编程并提供常量构造函数

我们可以做到:

class-Foo{
const Foo():断言(false);
}
但不能这样做:

class-Foo{
const Foo(){throw 42;}
}
类似地,一些健康检查也相对昂贵

例如,在flatter的上下文中,您可能希望遍历小部件树来检查小部件的祖先。但这是昂贵的,因为有些东西只对开发人员有用

在断言中执行该检查既可以提高发布中的性能,也可以提高开发中的实用性

assert(someVeryExpensiveCheck());
Background
  • 在Dart中,
    异常
    用于运行时可能发生的预期不良状态。因为这些异常是预期的,所以您应该捕获它们并适当地处理它们
  • 另一方面,
    错误
    ,是针对使用您的代码的开发人员的。您抛出一个错误,让他们知道他们错误地使用了您的代码。作为使用API的开发人员,您不应该捕捉错误。你应该让他们破坏你的应用程序。让这次撞车给你一个信息,你需要找出你做错了什么
  • 断言
    错误
    类似,因为它用于报告永远不会发生的错误状态。区别在于,断言仅在调试模式下检查。它们在生产模式中被完全忽略
阅读有关
异常
错误
之间区别的更多信息

接下来,下面是几个示例,以了解如何在颤振源代码中使用每个示例

抛出异常的示例 这来自:

@optionalTypeArgs
Future_invokeMethod(字符串方法,{required bool missingOk,dynamic arguments})异步{
断言(方法!=null);
最终ByteData?结果=等待binaryMessenger.send(
名称
codec.encodeMethodCall(MethodCall(方法,参数)),
);
如果(结果==null){
如果(丢失){
返回null;
}
抛出MissingPluginException(“在通道$name上找不到方法$method的实现”);
}
将codec.decodeEnvelope(结果)返回为T;
}
MissingPluginException
这里是可能发生的计划错误状态。如果发生这种情况,平台通道API的用户需要准备好处理这种情况

抛出错误的示例 这来自于

TargetPlatform\u当前主机平台(平台平台){
if(平台isMacOS){
返回TargetPlatform.darwin_x64;
}
if(platform.isLinux){
返回TargetPlatform.linux_x64;
}
if(platform.isWindows){
返回TargetPlatform.windows_x64;
}
抛出UnimplementderRor('不支持主机操作系统');
}
首先,用尽所有可能性,然后抛出错误。这在理论上是不可能的。但是如果抛出它,那么它要么向API用户表明您使用它是错误的,要么向API维护人员表明他们需要处理另一种情况

使用资产的例子 这来自:

OverlayEntry({
需要这个.builder,
bool不透明=假,
bool maintaintState=false,
}):assert(builder!=null),
断言(不透明!=null),
断言(maintaintState!=null),
_不透明的,
_保持状态=保持状态;
颤振源代码中的模式是在构造函数的初始值设定项列表中自由地使用断言。它们比错误更常见

总结
在阅读flatter源代码时,在构造函数初始值设定项列表中使用断言作为初步检查,并在方法体中使用抛出错误作为最后手段检查。当然,就我所见,这并不是一个硬性规定,但它似乎符合我迄今为止所看到的模式。

是的,这很清楚,问题是如果我们同意断言发出错误状态信号,但实际上不应该发生,为什么还要使用断言。我看到它是否用于优化的唯一原因是,如果它是一个经常调用的函数,并且您希望消除条件检查释放模式。是的,这很清楚,问题是,如果我们同意断言发出错误状态的信号,那么为什么要使用断言,这真的不应该发生。我看到的唯一原因是,如果它是一个经常被调用的函数,并且您希望消除条件检查的释放模式,那么它是否用于优化。非常好的一点。如果Dart团队给出了一些答案,那就等着吧:-)所以你可以说总是出错,除非支票是昂贵的。不,我不会这么说,但这是自以为是的。我不认为这里有一个适合所有人的建议。我的理解正确吗,
@需要这个。builder
是为了获得w