为什么 Dart 中有错误和异常,而不是错误或异常?
原因是历史原因还是什么?
我可以抛出一个错误,我可以抛出一个异常。分析器不会像在 Java 中那样检查它们(异常与 RuntimeException)
为什么 Dart 中有错误和异常,而不是错误或异常?
原因是历史原因还是什么?
我可以抛出一个错误,我可以抛出一个异常。分析器不会像在 Java 中那样检查它们(异常与 RuntimeException)
从这篇文章中,引用 Bob Nystrom 的话:
Error 及其子类用于程序错误。如果发生其中一种情况,则您的代码很糟糕,您应该修复您的代码。
非错误异常类用于运行时错误。有时你可以防止它们被抛出,但通常你不能。
除了少数特殊情况,惯用的 Dart 应该抛出错误,但从不捕获它们。它们的存在是为了不被发现,因此它们会关闭应用程序并提醒程序员注意错误的位置。
换句话说,您应该期待(并检查)异常(您应该处理它们)。如果您收到错误,那么您需要检查您如何使用引发错误的 API - 您可能使用错误。
如果您正在编写 API,那么您应该使用相同的模式。错误是向下游开发人员发送的关于他们如何使用您的 API 的消息。
应该为常规的、预期的程序流抛出一个Exception
in Dart并打算被捕获:
异常旨在向用户传达有关失败的信息,以便可以通过编程方式解决错误。它旨在被捕获,并且应该包含有用的数据字段。
TimeoutException
ATimeoutException
将被抛出“当等待异步结果时发生预定的超时”,这是预期的程序流程。
例如,如果我们有一个下载任务,并且该下载任务在我们指定的 30 秒超时时间(可能发生)后仍未完成,我们希望将其传达给我们的用户,因此,我们需要catch
将Exception
.
应该为意外的程序流抛出一个Error
in Dart并且不应该被程序员捕获而是解决:
Error
对象代表程序员应该避免的程序故障。
AssertionError
An在“断言语句失败时AssertionError
”被抛出,即它不应该发生,因为我们认为它不应该发生。
如果我们看到这样的错误,这意味着我们应该更改我们的代码,我们绝对不应该捕获错误。assert
在实践中,您可以捕获Error
s,但您不应该这样做。有一个linter 规则可以帮助强制执行。
Dart 允许它仍然有用的事实,例如在测试断言或其他错误时。
例外被认为是您可以提前计划并抓住的条件。
错误是您不期望或未计划的情况。
更详细的答案
感谢克里斯,从这里开始
当出现预期的问题时,应使用异常。常见的一种是任何类型的 I/O 操作(如网络流量),其中套接字会提前关闭,并且尝试将数据写入该套接字会失败。
出现意外问题时会发生错误。
诸如空指针(您希望此变量不为空)、运行我们的内存等...当您尝试以错误的方式使用 API 或类似的东西时。在大多数情况下,作为应用程序开发人员,您将始终使用异常。错误往往是为意外和致命问题保留的。