Flutter: использование try/catch внутри функции Future

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

Решение

Моя 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 в этом случае?

А1. Я думаю, ты сделал это правильно.

-

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

A2. Да, конечно. Вы можете проверить исключения на image_picker

-

Q3. Есть ли другие ошибки / исключения, о которых я должен позаботиться?

A3. Это сложно понять, вам следует посмотреть исходный код или просто обработать интересующее вас исключение и позволить другим быть предупреждением (AlertDialog, Snackbar...так далее).

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

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

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

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

  1. Делает try/catch подход к такого рода вопросам?

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

Другие вопросы по тегам