相关疑难解决方法(0)

在 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 中抛出非用户错误的正确方法是什么?

error-handling exception dart

6
推荐指数
1
解决办法
3487
查看次数

Dart中推荐的方法是:断言或引发错误

Dart明确区分了Error和Exception,它们是代码逻辑中的一个问题,该错误永远不会发生,也永远不会被捕获,这是基于运行时数据的一个信号。

我真的很喜欢这种区别,但是我想知道何时应该使用断言?

dart flutter

6
推荐指数
3
解决办法
104
查看次数

如何测试断言?

我发现了如何测试异常或错误: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)

dart flutter flutter-test

5
推荐指数
1
解决办法
1306
查看次数

在 Dart 中因参数无效(例如登录)而引发异常?

signIn我在 Dart 程序中有一个异步函数,它接受usernamepassword字符串参数。该函数调用远程服务器,如果用户名和/或密码丢失或不正确,服务器会使用会话令牌或验证消息进行响应。

目前我已经通过回调实现了这一点。服务器响应后会调用适当的回调。不需要await

signIn(username, password, onSuccess, onFailure);
Run Code Online (Sandbox Code Playgroud)

我对 Dart 的了解越多,我觉得上面的内容并不是真正的 Dart 做事方式。我应该awaittryand结合使用吗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 …

dart flutter

3
推荐指数
1
解决办法
4518
查看次数

标签 统计

dart ×4

flutter ×3

error-handling ×1

exception ×1

flutter-test ×1