Dart中的Error和Exception有何区别?

84
为什么Dart中存在错误和异常,而不是只有错误或异常?
这个原因是历史原因吗?
我可以抛出一个错误(Error),也可以抛出一个异常(Exception)。但是它们都不像Java中的分别是被Analyzer检查的异常(Exception)和运行时异常(RuntimeException)。
3个回答

103
这篇文章引用Bob Nystrom的话:
 

Error及其子类是用来表示编程错误的。如果出现其中之一,那么你的代码有问题,你应该修复它。

 

非Error异常类用于表示运行时错误。有时可以防止它们被抛出,但通常无法防止。

 

除了少数特殊情况外,惯用的Dart应该抛出Errors,但永远不要捕获它们。它们存在的目的是不被捕获,以便它们使应用崩溃并警报程序员定位错误的位置。

换句话说,您应该期望(并检查)异常(这是您打算处理它们的)。如果发生错误,则需要检查正在引发错误的API的使用方式-您可能正在错误使用它。 如果您正在编写API,则应使用相同的模式。 错误是向下游开发人员传达他们如何使用您的API的消息。

2
谢谢Chris的澄清!我认为这在文档中缺失了。已经有一个相关问题:https://code.google.com/p/dart/issues/detail?id=9377 - Mike Mitterer

49

异常

在Dart中,异常应该被抛出以表示程序的正常、预期流程,并且旨在被捕获:

异常旨在向用户传达有关失败的信息,以便可以通过编程方式解决错误。它旨在被捕获,并且应该包含有用的数据字段。

示例:TimeoutException

当我们等待异步结果时,如果到达了我们指定的超时时间,就会抛出TimeoutException,这是预期的程序流程。
例如,如果我们有一个下载任务,而在我们指定的30秒超时时间之后,下载任务仍未完成(这可能会发生),我们希望将此信息传达给用户,因此需要catch异常

错误

在Dart中,错误应该被抛出以表示意外的程序流程,并且不应该被捕获,而是由程序员进行处理:

一个Error对象代表程序失败,程序员应该避免这种情况发生。
例子:AssertionError 当一个断言语句失败时,会抛出AssertionError,即它不应该发生,因为我们断言它不会发生。 如果我们看到这样的错误,意味着我们应该修改我们的代码,而且绝不能捕获错误。
实际上,你可以捕获Error,但是不应该这样做。有一个linter rule来帮助执行此操作。
Dart允许这样做的事实仍然有用,例如在testing assertions或其他错误时。

请参考这个答案获取完整的示例场景。


如果您能提供ExceptionError的简单示例,那就太好了。 - user6274128
现在它正在为您的帖子增加更多价值(+1)。 - user6274128

1

异常被认为是您可以提前计划并捕获的条件。

错误是您不希望或计划的条件。


对于更详细的答案,请参考Chris和这里的信息。

当出现预期问题时,应使用异常。常见的情况是任何类型的I/O操作(如网络流量),其中套接字提前关闭,并且尝试向该套接字写入数据失败。

错误发生在出现未预期的问题时。例如空指针(您期望此变量不为空),内存耗尽等... 当您尝试以错误的方式使用API或类似的东西时。

大多数情况下,作为应用程序开发人员,您将始终使用异常。 错误往往保留给意外和致命的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接