【发布时间】:2021-02-22 11:59:02
【问题描述】:
此代码示例
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
(使用包 effective_dart 强制执行)
分析抱怨avoid_catching_errors
不要显式捕获错误或实现它的类型。
错误与异常的不同之处在于可以分析和分析错误 在运行前阻止。几乎从不需要 在运行时捕获错误。
不好:
尝试 { somethingRisky(); } on Error catch(e) { doSomething(e); } 好:
尝试 { somethingRisky(); } 关于异常 catch(e) { doSomething(e); }
如果我简单的话
try {} catch (e) {}
分析器抱怨avoid_catches_without_on_clauses
避免没有 on 子句的捕获。
使用不带 on 子句的 catch 子句会使您的代码容易 遇到不会抛出的意外错误(因此会发生 没有注意到)。
不好:
try { somethingRisky() } catch(e) { doSomething(e);好:
try { somethingRisky() } on Exception catch(e) { doSomething(e); }
【问题讨论】:
标签: flutter dart exception error-handling dart-analyzer