【问题标题】:Error vs. Exception in DartDart 中的错误与异常
【发布时间】:2013-06-23 08:22:07
【问题描述】:

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

历史原因是什么?

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    来自this post,引用 Bob Nystrom 的话:

    Error 及其子类用于程序错误。如果其中之一 发生,你的代码是坏的,你应该修复你的代码。

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

    除了少数特殊情况,惯用的 Dart 应该扔 错误,但永远不要抓住它们。它们的存在是为了不 被抓到,以便他们关闭应用程序并提醒程序员注意 错误的位置。

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

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

    【讨论】:

    【解决方案2】:

    异常

    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 获取完整的示例场景。

    【讨论】:

    • 如果您为ExceptionError 提供了一个简单的示例,那就太好了。
    • 现在它为您的帖子增加了更多价值 (+1)
    【解决方案3】:

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

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


    更详细的答案

    感谢 Chris 和 here

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

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

    在大多数情况下,作为应用开发者,您总是会使用异常。错误往往是为意外和致命问题保留的。

    【讨论】:

      【解决方案4】:

      在 Dart 中,异常是针对可能在运行时发生的预期不良状态。因为这些异常是预期的,所以您应该捕获它们并适当地处理它们。另一方面,错误适用于使用您的代码的开发人员。你抛出一个错误,让他们知道他们错误地使用了你的代码。

      取自here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 2010-10-24
        • 2010-10-29
        • 1970-01-01
        • 2013-05-16
        • 2012-08-16
        相关资源
        最近更新 更多