【发布时间】:2019-08-20 23:00:34
【问题描述】:
Dart 提供了一个Error 类和一个Exception 类来抛出异常。为什么Error 构造函数不像Exception 构造函数那样接受消息参数?
程序失败时抛出的错误对象。
Error 对象表示程序员应该避免的程序故障。
异常旨在向用户传达有关失败的信息,以便可以通过编程方式解决错误。它旨在被捕获,并且应该包含有用的数据字段。
较早的SO answer 引用了一篇文章来确认这种区别。
我喜欢这种区别。这告诉我,我的许多检查都应该抛出 Error 的实例。
我很高兴使用错误类型对Error 进行子类化,但我仍然需要报告导致错误的值。为什么 Dart 让我可以轻松地使用 Exception 而不是 Error?
我意识到我可以通过声明一个应用范围的错误类来解决问题:
class AppError extends Error {
String message;
AppError([this.message]);
String toString() {
return message == null ? runtimeType : "$runtimeType: $message";
}
}
Error 和Exception 之间的这种差异让我认为我误解了Error 或使用不当。在 Dart 中抛出非用户错误的正确方法是什么?
【问题讨论】:
-
可能是直接使用
Error来劝阻(你可能不应该这样做)。考虑通过assert(condition, message)或StateError改用AssertionError。 -
@jamesdlin,啊哈!我打赌就是这样。非常感谢!
-
Google 显示 'dart "throw StateError"' 总共有 42 个命中,这并没有给我太多信心,但这个示例页面是其中之一,表明
StateError确实是可以使用的throwable。 (assert()使用有限,因为它无法保护生产中的状态。)dart.dev/samples#exceptions -
在发布代码中关于
assert()的公平点,尽管您可以直接抛出AssertionError(或创建自己的assert类似函数来执行此操作)。关于StateError,低命中数可能会产生误导,因为StateError经常通过其他机制(例如quiver.check 函数)抛出。 -
@jamesdlin,如果您将两个 cmets 组合成一个答案,我很乐意将其标记为我的首选答案。
标签: exception dart error-handling