未来的执行会导致未处理的异常
Future execution leads to unhandled exception
import 'dart:async';
void main() {
divide(1, 0).then((result) => print('1 / 0 = $result'))
.catchError((error) => print('Error occured during division: $error'));
}
Future<double> divide(int a, b) {
if (b == 0) {
throw new Exception('Division by zero');
}
return new Future.value(a/b);
}
目前我正在学习如何在 Dart 中使用 futures,但我被困在这样一个简单的例子上。当用户尝试除以零时,我的未来会抛出异常。但是,.catchError 不处理我的异常。我用堆栈跟踪得到了未处理的异常。我很确定我遗漏了一些明显的东西,但无法理解到底是什么。
据我了解,还有另一种处理错误的方法:
divide(1, 0).then((result) => print('1 / 0 = $result'),
onError: (error) => print('Error occured during division: $error'));
使用命名可选参数 - onError。这样做仍然会导致未处理的异常。
我想再澄清一件事。我对吗? - 这两种方法之间的唯一区别是 .catchError() 还处理内部 future 抛出的错误(在外部 future 的 then() 方法中调用的 futures)而 onError 只捕获外部 future 抛出的错误?
德米特里
谢谢。
您的错误处理无效,因为错误是在代码的同步部分引发的。仅仅因为方法 returns 未来并不意味着此方法中的所有内容都是异步的。
void main() {
try {
divide(1, 0)
.then((result) => print('1 / 0 = $result'));
} catch (error) {
print('Error occured during division: $error');
}
}
如果您将 divide
函数更改为
Future<double> divide(int a, b) {
return new Future(() {
if (b == 0) {
throw new Exception('Division by zero');
}
return new Future.value(a / b);
});
}
您收到一个异步错误并且您的异步错误处理有效。
更简单的方法是使用新的 async/await
main() async {
try {
await divide(1, 0);
} catch(error){
print('Error occured during division: $error');
}
}
尝试 DartPad
另一个优点是这在两种情况下都有效。
import 'dart:async';
void main() {
divide(1, 0).then((result) => print('1 / 0 = $result'))
.catchError((error) => print('Error occured during division: $error'));
}
Future<double> divide(int a, b) {
if (b == 0) {
throw new Exception('Division by zero');
}
return new Future.value(a/b);
}
目前我正在学习如何在 Dart 中使用 futures,但我被困在这样一个简单的例子上。当用户尝试除以零时,我的未来会抛出异常。但是,.catchError 不处理我的异常。我用堆栈跟踪得到了未处理的异常。我很确定我遗漏了一些明显的东西,但无法理解到底是什么。
据我了解,还有另一种处理错误的方法:
divide(1, 0).then((result) => print('1 / 0 = $result'),
onError: (error) => print('Error occured during division: $error'));
使用命名可选参数 - onError。这样做仍然会导致未处理的异常。
我想再澄清一件事。我对吗? - 这两种方法之间的唯一区别是 .catchError() 还处理内部 future 抛出的错误(在外部 future 的 then() 方法中调用的 futures)而 onError 只捕获外部 future 抛出的错误?
德米特里
谢谢。
您的错误处理无效,因为错误是在代码的同步部分引发的。仅仅因为方法 returns 未来并不意味着此方法中的所有内容都是异步的。
void main() {
try {
divide(1, 0)
.then((result) => print('1 / 0 = $result'));
} catch (error) {
print('Error occured during division: $error');
}
}
如果您将 divide
函数更改为
Future<double> divide(int a, b) {
return new Future(() {
if (b == 0) {
throw new Exception('Division by zero');
}
return new Future.value(a / b);
});
}
您收到一个异步错误并且您的异步错误处理有效。
更简单的方法是使用新的 async/await
main() async {
try {
await divide(1, 0);
} catch(error){
print('Error occured during division: $error');
}
}
尝试 DartPad
另一个优点是这在两种情况下都有效。