为什么Dart中存在错误和异常,而不是错误或异常?
这是一个历史性的原因是什么?
我可以抛出一个错误,我可以抛出异常。分析器中没有像Java(Exception vs. RuntimeException)那样检查它们
答案 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或类似的东西时。在大多数情况下,作为应用程序开发人员,您将始终使用异常。错误往往会保留给意外的致命问题。