Flutter:在 Future 函数中使用 try/catch

Flutter: Using try/catch inside Future function

在我的应用程序中,我想用相机拍摄图像,为此我正在使用 image_picker 库。

这是我的代码:

import 'dart:io';

import 'package:image_picker/image_picker.dart';

Future<File> getImage() async {
   var image = await ImagePicker.pickImage(source: ImageSource.camera);

   return image;
}

它工作正常,但如果由于某种原因相机不可用,那么它会使应用程序崩溃。所以,我认为我们可以通过在 try/catch 中使用它来避免这种情况(如果我错了请纠正我)。

我添加了 try/catch,这里是更新后的代码:

try {
  var image = await ImagePicker.pickImage(source: ImageSource.camera);

} catch (e) {
  print(e);
}
return image;

我的 IDE 抛出错误,变量 image 未定义.

问题:

  1. 在这种情况下如何正确使用 try/catch
  2. try/catch 是解决此类问题的方法吗?
  3. 还有其他error/exception,我应该关心的吗?

My IDE throws error, variable image is not defined.

先尝试解决这个问题。

更改代码:

try {
  var image = await ImagePicker.pickImage(source: ImageSource.camera);

} catch (e) {
  print(e);
}
return image;

var image;
try {
  image = await ImagePicker.pickImage(source: ImageSource.camera);

} catch (e) {
  print(e);
}
return image;

您的问题:

Q1。在这种情况下如何正确使用 try/catch?

A1。我觉得你做对了。

-

Q2。 try/catch 是解决此类问题的方法吗?

A2。是的,一点没错。您可能想检查 image_picker

上的例外情况

-

Q3。还有其他error/exception,我应该关心的吗?

A3。这很难知道,你应该看看source code,或者只处理你感兴趣的异常,让其他人成为一个Alert(AlertDialogSnackbar ...等)。

与大多数 C 类语言一样,variables declared within a scope are available only within that scope。换句话说,如果您在 { ... } 块中声明一个变量,则不能在该块外直接引用它。如果您需要在外部块中使用变量,则需要将其声明移出。

  1. How do I use try/catch properly in this case?

You should avoid catch (e) 因为这将捕获 所有 类型的异常,包括 逻辑 错误(AssertionErrorArgumentError, 等等).

通常的建议是 avoid catching exceptions that derive from Error。 (通常这意味着只捕获 runtime 错误,这应该是从 Exception 派生的异常。在实践中,有些代码不遵循这种区别,并且在一些在某些情况下,什么应该被视为逻辑错误与什么应该被视为运行时错误之间没有明确的界限。)

  1. Does try/catch is the approach for these kind of issues?

如果没有提供预先检查操作是否成功的机制("look before you leap"),那么您别无选择,只能尝试并检查是否失败("easier to ask for forgiveness than permission" ).