【发布时间】:2013-06-23 08:22:07
【问题描述】:
为什么 Dart 中有错误和异常,而不是错误或异常?
历史原因是什么?
我可以抛出一个错误,我可以抛出一个异常。分析器不会像在 Java 中那样检查它们(异常与 RuntimeException)
【问题讨论】:
标签: dart
为什么 Dart 中有错误和异常,而不是错误或异常?
历史原因是什么?
我可以抛出一个错误,我可以抛出一个异常。分析器不会像在 Java 中那样检查它们(异常与 RuntimeException)
【问题讨论】:
标签: dart
来自this post,引用 Bob Nystrom 的话:
Error 及其子类用于程序错误。如果其中之一 发生,你的代码是坏的,你应该修复你的代码。
Non-Error 异常类用于运行时错误。有时你可以 防止它们被抛出,但通常你不能。
除了少数特殊情况,惯用的 Dart 应该扔 错误,但永远不要抓住它们。它们的存在是为了不 被抓到,以便他们关闭应用程序并提醒程序员注意 错误的位置。
换句话说,您应该期待(并检查)异常(您应该处理它们)。如果您遇到错误,那么您需要检查您是如何使用引发错误的 API 的——您可能使用错了。
如果您正在编写 API,那么您应该使用相同的模式。错误是向下游开发人员发送的关于他们如何使用您的 API 的消息。
【讨论】:
Exception in Dart 应该为常规的、预期的程序流 抛出并且打算被捕获:
Exception 旨在向用户传达有关故障的信息,以便可以通过编程方式解决错误。它旨在被捕获,并且应该包含有用的数据字段。
TimeoutException
TimeoutException 将被抛出“在等待异步结果时发生预定超时”,这是预期的程序流程。
例如,如果我们有一个下载任务,并且在我们指定的 30 秒超时时间(可能发生)之后下载任务没有完成,我们希望将其传达给我们的用户,因此,我们需要 catch Exception .
Error in Dart 应针对意外的程序流 并且不应被捕获但由程序员处理:
Error对象表示程序员应该避免的程序故障。
AssertionError
AssertionError 被抛出“断言语句失败”,即它应该永远发生,因为我们 assert 不应该发生这种情况。
如果我们看到这样的错误,这意味着我们应该更改我们的代码,我们绝对不应该捕获错误。
实际上,您可以捕获Errors,但您不应该这样做。有一个 linter rule 可以帮助执行此操作。
Dart 允许它仍然有用的事实,例如当testing assertions 或其他错误时。
See this answer 获取完整的示例场景。
【讨论】:
Exception 和Error 提供了一个简单的示例,那就太好了。
例外被认为是您可以提前计划并抓住的情况。
错误是您不期望或未计划的情况。
更详细的答案
感谢 Chris 和 here
当出现预期的问题时,应使用异常。一种常见的情况是任何类型的 I/O 操作(如网络流量),其中套接字会提前关闭,并且尝试将数据写入该套接字会失败。
出现意外问题时会发生错误。
诸如空指针(您希望此变量不为空)、运行我们的内存等...当您尝试以错误的方式使用 API 或类似的事情时。在大多数情况下,作为应用开发者,您总是会使用异常。错误往往是为意外和致命问题保留的。
【讨论】:
在 Dart 中,异常是针对可能在运行时发生的预期不良状态。因为这些异常是预期的,所以您应该捕获它们并适当地处理它们。另一方面,错误适用于使用您的代码的开发人员。你抛出一个错误,让他们知道他们错误地使用了你的代码。
取自here
【讨论】: