Flutter: использование try / catch внутри функции Future - PullRequest
0 голосов
/ 20 сентября 2019

В моем приложении я хочу сделать снимок с камеры, и для этого я использую библиотеку 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 ]

2 голосов
/ 20 сентября 2019

My IDE выдает ошибку, переменное изображение не определено.

Попробуйте сначала решить эту проблему.

Измените код:

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

} catch (e) {
  print(e);
}
return image;
*От 1009 * до
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 ... и т. Д.).

1 голос
/ 20 сентября 2019

Как и в большинстве языков, подобных C, переменные , объявленные в области действия , доступны только в этой области действия .Другими словами, если вы объявляете переменную в блоке { ... }, на нее нельзя напрямую ссылаться за пределами этого блока.Если вам нужно использовать переменную во внешнем блоке, вам нужно переместить ее объявление.

  1. Как правильно использовать try / catch в этом случае?

Вам следует избегать catch (e), поскольку это приведет к всем типам исключений, включая логические ошибки (AssertionError. ArgumentError и т. Д.).

Обычно рекомендуется избегать перехвата исключений, которые происходят из Error.(Как правило, это означает перехват только ошибок времени выполнения , которые должны быть исключениями, полученными вместо Exception. На практике существует код, который не следует этому различию, а в некоторых случаях нетчеткая грань между тем, что следует считать логической ошибкой, и тем, что следует считать ошибкой времени выполнения.)

Подходит ли try / catch для решения подобных проблем?

Если не предусмотрен механизм, позволяющий заранее проверить, будет ли операция успешной (вы прыгаете "), тогда у вас нет другого выбора, кроме как попробовать его и проверить на неудачу (" проще просить прощения, чем разрешения ").

...