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
не определено.
Вопросы:
- Как мне использовать
try/catch
правильно в этом случае? - Делает
try/catch
подход к такого рода вопросам? - Есть ли другие ошибки / исключения, о которых я должен позаботиться?
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-подобных языков, переменные, объявленные в области видимости, доступны только в этой области. Другими словами, если вы объявляете переменную внутри{
... }
блок, на него нельзя напрямую ссылаться вне этого блока. Если вам нужно использовать переменную во внешнем блоке, вам нужно будет переместить ее объявление.
- Как мне использовать
try
/catch
правильно в этом случае?
Вам следует избегать catch (e)
так как это перехватит все типы исключений, включая логические ошибки (AssertionError
. ArgumentError
, так далее.).
Обычная рекомендация - избегать перехвата исключений, которые происходят изError
. (Обычно это означает перехват только ошибок времени выполнения, которые должны быть исключениями, происходящими изException
вместо. На практике есть код, который не следует этому различию, и в некоторых случаях нет четкой границы между тем, что следует считать логической ошибкой, и тем, что следует считать ошибкой времени выполнения.)
- Делает
try
/catch
подход к такого рода вопросам?
Если не предусмотрен механизм, позволяющий заранее проверить, будет ли операция успешной ("посмотри, прежде чем прыгнуть"), тогда у вас нет другого выбора, кроме как попробовать ее и проверить на предмет неудачи ("проще попросить прощения, чем разрешения").