Dart中的错误与异常

时间:2013-06-26 09:10:52

标签: dart

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

这是一个历史性的原因是什么?

我可以抛出一个错误,我可以抛出异常。分析器中没有像Java(Exception vs. RuntimeException)那样检查它们

3 个答案:

答案 0 :(得分:32)

来自this post,引用Bob Nystrom:

  

错误及其子类用于编程错误。如果其中之一   发生,你的代码很糟糕,你应该修复你的代码。

     

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

     

除少数特殊情况外,惯用的Dart应该抛出   错误,但从未捕捉到它们。它们是专门存在的   捕获,以便他们取下应用程序并提醒程序员   错误的位置。

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

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

答案 1 :(得分:2)

异常

应该抛出一个Exception in Dart以用于正常的预期程序流,并且打算被捕获

  

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

示例:TimeoutException

TimeoutException将被抛出“ 在等待异步结果时发生计划的超时”,这是预期的程序流。
例如,如果我们有一个下载任务,但在指定的30秒超时时间(可能发生)之后该下载任务没有完成,则我们希望将其传达给用户,因此,我们需要catch { {1}}。

错误

应该抛出Error in Dart来处理意外的程序流,并且不应被捕获,但应由程序员解决:

  

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

示例:Error

AssertionError会在“断言语句失败时抛出 ”,即它应该永远不会发生,因为我们AssertionError不会这样做。
如果看到这样的错误,则意味着我们应该更改代码,并且绝对不要捕获该错误。


在实践中,您可以抓捕assert,但是您不可以。有linter rule可以帮助实施。
Dart允许它的事实仍然有用,例如testing assertions或其他错误。


See this answer了解完整的示例场景。

答案 2 :(得分:0)

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

错误是您无法预期或计划的情况。


有关更详细的答案

感谢克里斯和here的来信

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

当没有预期到的问题时发生错误。 诸如空指针(您希望此变量不为null),运行内存等之类的东西。当您尝试以错误的方式使用API​​或类似的东西时。

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