Эксепшн при разборе командной строки с неизвестной командой.
realMaxA opened this issue · 3 comments
При разборе командной строки, если в качестве аргумента была указана несуществующая команда, парсер вываливается в эксепшн, что не совсем хорошо.
Например пользователь просто опечатался в имени команды, скрипт не должен его за это ругать страшным капсом "КРИТИЧНАЯОШИБКА", а мягко намекнуть, что он возможно допустил ошибку.
Сейчас извне на это поведение никак повлиять нельзя, даже при оборачивании разбора в попытку эксепшн всё равно выводится в консоль.
В идеале желательно иметь информацию о характере проблемы при разборе и дополнительную поясняющую информацию.
Например пользователь пытается выполнить gitsync inir
, Такой команды нет, парсер должен вернуть что-то вроде
- Тип ошибки: Не найдена команда
- Комментарий: "inir"
Что в вызываемом скрипте можно будет обработать и корректно оповестить пользователя.
Дело в том, что не все есть команда. Эту ситуауию парсер пытается обработать, как значение позиционного параметра.
Согласен, что уровень КритичнаяОшибка это перебор. Однако, это все же ошибка и о ней надо сообщить.
Дополнительно, можем сделать так, чтоб парсер понимал, что если у него нет позиционных параметров вообще, а сплошь команды, то ругаться надо чуть иначе, как предложено в начале.
Вопрос, кто должен ругаться? Приложение или парсер?
Мы пишем приложение и знаем, что является ошибкой, а что нет. Парсер должен просто добросовестно выполнить свою работу и сообщить о всех трудностях, с которыми столкнулся в процессе разбора, а не принимать решение за приложение, что делать дальше.
Даже при наличии позиционных параметров нужно корректно отрабатывать ситуацию.
Пример тот же gitsync: Вводим команду gitsync inir /Путь/К/Хранилищу /Локальный/Каталог/Git
На выходе пользователь должен получить что-то вроде: Команда "inir" не найдена, и вывести это сообщение должен не cmdline, а само приложение. Может оно молча захочет вывести help, а может сообщит что-то, пукнет в динамик и тоже выведет help... или не выведет.
Я пока слабо представляю, как это можно исправить, пишу этот issue на будущее.
Команда "inir" не найдена, и вывести это сообщение должен не cmdline, а само приложение
Парсер выдает исключение, если пользовательский ввод не совпадает ни с одним паттерном. Приложение может это перехватить и вывести все что пожелает. Но парсер понятия не имеет, что делать, если он не смог обработать пользовательский ввод. Поэтому он и бросает исключение, чтобы приложение решило, что делать дальше. Чаще всего приложение ничего не делает и выдает ошибку.
Текст "Команда inir не найдена" должен сформировать именно cmdline.