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

时间:2019-09-20 11:23:01

标签: flutter dart try-catch imagepicker

在我的应用程序中,我想用相机拍摄图像,为此我正在使用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. 还有其他错误/例外,我应该关心吗?

2 个答案:

答案 0 :(得分:2)

  

我的IDE抛出错误,未定义可变图像。

尝试先解决此问题。

更改代码:

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。尝试/捕获是解决此类问题的方法吗?

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

上的异常

-

Q3。还有其他我应该关心的错误/异常吗?

A3。这很难知道,您应该查看source code,或者只处理您感兴趣的异常,然后让其他人成为警报(AlertDialogSnackbar ...等)。

答案 1 :(得分:1)

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

  
      
  1. 在这种情况下如何正确使用try / catch
  2.   

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

通常的建议是avoid catching exceptions that derive from Error。 (通常,这意味着仅捕获 runtime 错误,这应该是源自Exception的异常。实际上,有一些代码没有遵循这种区别,在某些情况下,没有在应该认为是逻辑错误和应该在运行时错误之间没有明确的界限。)

  
      
  1. try / catch是解决此类问题的方法吗?
  2.   

如果没有提供任何机制来预先检查操作是否会成功(“跨越前先看”),那么您别无选择,只能尝试一下并检查失败(“更容易请求宽恕”)比权限”)。