Joe*_*app 6 error-handling exception dart
Dart提供了一个Error类和一个Exception用于抛出异常的类。为什么Error构造函数不像构造函数那样接受消息参数Exception?
来自错误类文档:
程序失败时抛出的错误对象。
Error 对象表示程序员应该避免的程序故障。
来自异常类文档:
异常旨在向用户传达有关故障的信息,以便可以通过编程方式解决该错误。它旨在被捕获,并且应该包含有用的数据字段。
较早的SO 答案引用了一篇帖子,证实了这种区别。
我喜欢这种区别。这告诉我,我的许多检查应该抛出Error.
我很高兴使用Error错误类型进行子类化,但我仍然需要报告引发错误的值。为什么 Dart 让我可以轻松地使用 来执行此操作,Exception但不能使用Error?
我意识到我可以通过声明应用程序范围的错误类来解决问题:
class AppError extends Error {
String message;
AppError([this.message]);
String toString() {
return message == null ? runtimeType : "$runtimeType: $message";
}
}
Run Code Online (Sandbox Code Playgroud)
Error和之间的差异Exception让我认为我误解了Error或使用不当。在 Dart 中抛出非用户错误的正确方法是什么?
lrn*_*lrn 15
如果有的话,那就是一个错误,Exception需要一条消息。你永远不应该抛出一个 plain new Exception("message")。
Error和Exception(或者实际上,任何非抛出对象)之间的区别Error在于,它Error代表编程失败。
您的程序不应抛出Error正常操作的一部分。你不应该抓住一个特定的东西Error并对其做出反应。(框架可以捕获所有抛出的对象并记录它们,以便继续运行,但它们不应该专门对单个错误做出反应)。这意味着使用哪个类来表示错误实际上并不重要。错误的唯一目的是向程序员显示,以便他们可以修复错误。Dart 有许多有用的Error子类,它们涵盖了大多数情况,并确保错误消息的格式相当一致。本质上没有什么要求您使用 aRangeError来处理越界错误,它只是一个非常方便的帮助器类,它可以帮助读者理解发生了什么,我们建议您使用它。
ArgumentError当函数的参数不满足其额外(非类型)要求(例如,列表必须非空)时使用。RangeError对于数字参数,当数字不在预期范围内时,有一个for 。对于用作索引(如参数)的数字list.operator[],甚至还有一个专门的IndexError. 它们都是为了确保您获得一致的错误消息。
如果由于对象未处于支持的状态而无法立即执行操作,请使用StateError。
如果当前对象无法执行某个操作,请使用UnsupportedError。
实际上,StateError、UnsupportedError和ArgumentError(及其子类)涵盖了用户代码引发的大部分运行时错误。简单地抛出一个Error("message")错误比使用其中一个错误提供的信息要少,并且发明一种新的错误类型几乎不值得。
另一方面,异常是用来捕获和处理的。它是给调用者的一条消息,与返回值具有相同的重要性,并且它应该包含足够的信息,以便调用者捕获函数可能抛出的特定记录的异常,并对特定的异常情况做出反应。这就是为什么异常至少应该有一个独特的类型,允许您专门识别和捕获它,并且如果可能的话,它应该包含处理异常情况所需的任何信息。
获取FormatException由各种函数抛出的内容parse。这是特定于操作的。它包含可帮助您找出问题所在的可用信息(输入和与错误相关的位置,主要用于向用户显示,因为不能指望您修复输入。)
| 归档时间: |
|
| 查看次数: |
3487 次 |
| 最近记录: |