1

此代码示例

import 'package:flutter_test/flutter_test.dart';

void main() {
  const one = 1;
  String oneAsString() => one as String;

  test('Make sure it fails', () {
    var s;
    var _e;
    try {
      s = oneAsString();
    } on Error catch (e) {
      _e = e;
    }
    expect(s == null, true, reason: 'should fail');
    expect(_e == null, false, reason: 'error or exception should be returned');
  });

  test('Catchin Error', () {
    var _e;
    try {
      oneAsString();
    } on Error catch (e) {
      _e = e;
    }
    expect(_e is Error, true, reason: 'should be an error');
  });

  test('Catchin Exception', () {
    var _e;
    try {
      oneAsString();
    } on Exception catch (e) {
      _e = e;
    }

    expect(_e is Exception, true, reason: 'should be an exception');
  });

  test('Why not BOTH', () {
    var _e;
    try {
      oneAsString();
    } on Error catch (e) {
      _e = e;
    } on Exception catch (e) {
      _e = e;
    }

    expect(_e is Error, true, reason: 'should be an error');
    expect(_e is Exception, false, reason: 'should NOT be an exception');
  });
}

输出这个结果

00:02 +2 -1: Catchin Exception [E]                                                                                                                                                                          
  type 'int' is not a subtype of type 'String' in type cast
  test/widget_test.dart 5:31   main.oneAsString
  test/widget_test.dart 31:18  main.<fn>
  
00:02 +3 -1: Some tests failed.   

最安全的方法似乎是Why not BOTH,但是在使用有效的飞镖
(使用包 Effective_dart 强制执行)之后 ,分析抱怨 避免避免捕获错误

不要显式捕获错误或实现它的类型。

错误与异常的不同之处在于可以在运行前分析和防止错误。几乎从不需要在运行时捕获错误。

坏的:

尝试 { somethingRisky(); } on Error catch(e) { doSomething(e); } 好的:

尝试 { somethingRisky(); } 关于异常 catch(e) { doSomething(e); }

如果我简单地做

try {} catch (e) {}

分析器抱怨Avoid_catches_without_on_clauses

避免在没有 on 子句的情况下捕获。

在没有 on 子句的情况下使用 catch 子句会使您的代码容易遇到不会抛出的意外错误(因此不会被注意到)。

坏的:

尝试 { somethingRisky() } catch(e) { doSomething(e); } 好的:

尝试 { somethingRisky() } on Exception catch(e) { doSomething(e); }

捕获错误异常的正确方法是什么?

4

1 回答 1

0

@Miyoyor/FlutterDev discord重新发布答案

Optimally? You do not catch error
Just, at all
Remember effective dart is Guidelines
Using them as gospel will make some things impossible
Catching error is deliberately made to be "not according to guidelines"

因为你不应该那样做

对于我的用例,我将添加

// ignore_for_file: avoid_catching_errors

于 2021-02-22T13:33:52.407 回答