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 中抛出非用户错误的正确方法是什么?
Dart明确区分了Error和Exception,它们是代码逻辑中的一个问题,该错误永远不会发生,也永远不会被捕获,这是基于运行时数据的一个信号。
我真的很喜欢这种区别,但是我想知道何时应该使用断言?
我发现了如何测试异常或错误:https : //stackoverflow.com/a/54241438/6509751
但是如何测试以下内容assert是否正常工作?
void cannotBeNull(dynamic param) {
assert(param != null);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但不起作用。断言被简单地打印出来并且测试失败:
void main() {
test('cannoBeNull assertion', () {
expect(cannotBeNull(null), throwsA(const TypeMatcher<AssertionError>()));
});
}
Run Code Online (Sandbox Code Playgroud) signIn我在 Dart 程序中有一个异步函数,它接受username和password字符串参数。该函数调用远程服务器,如果用户名和/或密码丢失或不正确,服务器会使用会话令牌或验证消息进行响应。
目前我已经通过回调实现了这一点。服务器响应后会调用适当的回调。不需要await。
signIn(username, password, onSuccess, onFailure);
Run Code Online (Sandbox Code Playgroud)
我对 Dart 的了解越多,我觉得上面的内容并不是真正的 Dart 做事方式。我应该await与tryand结合使用吗catch?像下面这样的东西吗?
try {
sessionToken = await signIn(username, password);
// navigate from the sign in screen to the home screen.
} on InvalidParams catch (e) {
// e contains the server's validation messages
// show them to the user.
}
Run Code Online (Sandbox Code Playgroud)
登录凭据可能无效。处理它们是正常的程序流程。我被教导永远不要将 try/catch 用于常规的、预期的程序流程。Dart 语言似乎鼓励使用异常处理,尤其是与await.
来自错误类文档[强调我的。]
如果在调用函数之前无法检测到条件,则被调用的函数不应抛出错误。它仍然可能抛出一个值,但调用者必须捕获抛出的值,从而有效地使其成为替代结果而不是错误。抛出的对象可以选择实现 Exception 来记录它代表异常但不是错误的发生,但它除了记录之外没有其他作用。
实现这个的最好的 Dart …