【问题标题】:Flutter: Using try/catch inside Future functionFlutter:在 Future 函数中使用 try/catch
【发布时间】:2020-01-21 10:58:57
【问题描述】:

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

【问题讨论】:

    标签: flutter dart try-catch imagepicker


    【解决方案1】:

    我的 IDE 报错,变量 image 没有定义。

    尝试先解决这个问题。

    更改您的代码:

    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;
    

    对于您的问题:

    第一季度。在这种情况下如何正确使用 try/catch?

    A1。我认为你做对了。

    -

    第二季度。 try/catch 是解决这类问题的方法吗?

    A2。是的,一点没错。您可能需要检查 image_picker 上的异常情况

    -

    第三季度。还有其他我应该关心的错误/异常吗?

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

    【讨论】:

    • 我也是这样用的,到目前为止我没有发现任何错误/异常,效果很好。
    • 太棒了,问题解决了。再次澄清一下,return 将返回调用await 后分配给变量的实际值?我的意思是,如果变量具有默认值,并且它的值通过await 调用更改,那么它将返回新值而不是默认值。
    • @Tokenyet 如果可能,请查看并回复我的other question
    • var image; 会比File image; 更好。由于它现在是单独声明的,它的类型将不再被推断,所以它最终将是dynamic(因此不会被类型检查)。
    • 你说得对,但我认为每个人都有自己选择编码标准的权利,所以我没有指出:P
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答和澄清概念!请回复我的other question好吗?
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2017-05-01
    • 1970-01-01
    • 2020-01-18
    • 2021-11-02
    • 2018-10-10
    相关资源
    最近更新 更多