此代码示例
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); }