63

为什么 Dart 中有错误和异常,而不是错误或异常?

原因是历史原因还是什么?

我可以抛出一个错误,我可以抛出一个异常。分析器不会像在 Java 中那样检查它们(异常与 RuntimeException)

4

3 回答 3

81

这篇文章中,引用 Bob Nystrom 的话:

Error 及其子类用于程序错误。如果发生其中一种情况,则您的代码很糟糕,您应该修复您的代码。

非错误异常类用于运行时错误。有时你可以防止它们被抛出,但通常你不能。

除了少数特殊情况,惯用的 Dart 应该抛出错误,但从不捕获它们。它们的存在是为了不被发现,因此它们会关闭应用程序并提醒程序员注意错误的位置。

换句话说,您应该期待(并检查)异常(您应该处理它们)。如果您收到错误,那么您需要检查您如何使用引发错误的 API - 您可能使用错误。

如果您正在编写 API,那么您应该使用相同的模式。错误是向下游开发人员发送的关于他们如何使用您的 API 的消息。

于 2013-06-26T09:38:09.983 回答
26

例外

应该为常规的、预期的程序流抛出一个Exceptionin Dart打算被捕获

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

例子:TimeoutException

ATimeoutException将被抛出“当等待异步结果时发生预定的超时”,这是预期的程序流程。
例如,如果我们有一个下载任务,并且该下载任务在我们指定的 30 秒超时时间(可能发生)后仍未完成,我们希望将其传达给我们的用户,因此,我们需要catchException.

错误

应该为意外的程序流抛出一个Errorin Dart并且不应该被程序员捕获而是解决:

Error对象代表程序员应该避免的程序故障。

例子:AssertionError

An在“断言语句失败时AssertionError”被抛出,即它不应该发生,因为我们认为它不应该发生。 如果我们看到这样的错误,这意味着我们应该更改我们的代码,我们绝对不应该捕获错误。assert


在实践中,您可以捕获Errors,但您不应该这样做。有一个linter 规则可以帮助强制执行。
Dart 允许它仍然有用的事实,例如在测试断言或其他错误时。


有关完整的示例场景,请参阅此答案

于 2019-10-13T08:49:35.290 回答
1

例外被认为是您可以提前计划并抓住的条件。

错误是您不期望或未计划的情况。


更详细的答案

感谢克里斯,从这里开始

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

出现意外问题时会发生错误。诸如空指针(您希望此变量不为空)、运行我们的内存等...当您尝试以错误的方式使用 API 或类似的东西时。

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

于 2020-05-20T01:47:07.633 回答