【问题标题】:Dart / Flutter - Debugger stops on caught exceptionsDart / Flutter - 调试器在捕获到异常时停止
【发布时间】:2019-11-10 03:54:10
【问题描述】:

在检查 API 端点(确定连接状态)的相对简单的代码块中,我依赖 try..catch 作为验证应用程序是否可以与服务器通信的机制。

我遇到的问题是,在调试时,即使我在内部处理错误,调试器也总是停在连接线上(当应用程序离线时)。

  Future<bool> isOnline() async {
    try {
      // VSCode debugger always stops on this line when no connection
      await http
          .get('${consts.apiBaseUrl}/api/ping')
          .timeout(Duration(seconds: normalTimeoutLength))
          .catchError(
        (_) {
          // Trying catchError on the Future
          _isOnline = false;
          return false;
        },
      );
      _isOnline = true;
      return true;
    } on HttpException catch (_) {
      // Trying to catch HTTP Exceptions
      _isOnline = false;
      return false;
    } on SocketException catch (_) {
      // Trying to catch Socket Exceptions
      _isOnline = false;
      return false;
    }
  }

【问题讨论】:

    标签: exception flutter dart visual-studio-code vscode-debugger


    【解决方案1】:

    这是 Dart VM 的限制。它不能正确检测到catchError() 捕获的异常,因此会导致调试器暂停它们。这里有一些讨论:

    https://github.com/flutter/flutter/issues/33427#issuecomment-504529413

    如果您单击继续/恢复,则行为应该没有区别,但作为一种解决方法,您可以将代码转换为使用真正的 try/catch 而不是 catchError() 或取消选中调试侧栏中的选项打破未捕获的异常(尽管显然这也会影响真正的未捕获异常 - 尽管在 Flutter 中它们不太常见,因为框架捕获了大多数异常)。

    【讨论】:

    • 感谢您的回复 - 很高兴在雷达上看到此类问题(即使需要一段时间才能解决)。这个例子没有显示的是我用普通的try...catch 包裹,但不幸的是,这会产生相同的结果。我正在使用您的解决方法,只需要注意一点点 ?
    • 您使用的是哪个版本的 Flutter?您可以在beta 频道或更高版本上进行复制吗?我认为try/catch 版本中的一个错误也已修复,但它可能还没有在 Flutter 中稳定。如果您仍然可以在beta 中进行复制,并且可以使用 try/catch 制作一个小示例,那么值得在 dart-lang/sdk 存储库中打开一个问题进行一些调查。
    • 我基本上总是在dev 分支上保持最新状态。也许打开一个错误是值得的?我今天会检查它是否仍然在最新的 Flutter 开发版本中发生并恢复。
    • 我在稳定频道 v1.17.1 上也遇到了这个问题
    • 在 1.17.3 上仍然发生 - 在成功执行 try 之前禁用断点是我目前的解决方案。
    【解决方案2】:

    这是 Danny 回答的补充图片(VS Code):

    【讨论】:

      【解决方案3】:

      如果您希望绕过异常以使应用程序不会停止,您可以取消选中左侧“断点”下的“未捕获异常”框

      【讨论】:

        猜你喜欢
        • 2019-12-31
        • 2012-12-26
        • 1970-01-01
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2014-06-03
        • 1970-01-01
        相关资源
        最近更新 更多