4

在我的应用程序中,我想用相机拍摄图像,为此我正在使用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. 是否有任何其他错误/异常,我应该关心?
4

2 回答 2

6

我的 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。try/catch 是解决这类问题的方法吗?

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

-

Q3。是否有任何其他错误/异常,我应该关心?

A3。这很难知道,您应该查看源代码,或者只是处理您感兴趣的异常,并让其他人成为警报(AlertDialog...Snackbar等)。

于 2019-09-20T11:44:03.317 回答
2

与大多数类 C 语言一样,在范围内声明的变量仅在该范围内可用。换句话说,如果您在{...}块中声明变量,则不能在该块之外直接引用它。如果您需要在外部块中使用变量,则需要将其声明移出。

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

您应该避免catch (e),因为这将捕获所有类型的异常,包括逻辑错误(AssertionError.ArgumentError等)。

通常的建议是避免捕获源自Error. (通常这意味着只捕获运行时错误,这些错误应该是衍生自的异常Exception。在实践中,有些代码不遵循这种区别,并且在某些情况下,应该被视为合乎逻辑的内容之间并没有明确的界限错误以及应该被视为运行时错误。)

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

如果没有提供预先检查一个操作是否成功的机制(“在你跳跃之前先看”),那么你别无选择,只能尝试它并检查失败(“请求宽恕比许可更容易” )。

于 2019-09-20T15:59:34.467 回答