oscript-library/cmdline

Эксепшн при разборе командной строки с неизвестной командой.

realMaxA opened this issue · 3 comments

При разборе командной строки, если в качестве аргумента была указана несуществующая команда, парсер вываливается в эксепшн, что не совсем хорошо.

Например пользователь просто опечатался в имени команды, скрипт не должен его за это ругать страшным капсом "КРИТИЧНАЯОШИБКА", а мягко намекнуть, что он возможно допустил ошибку.

Сейчас извне на это поведение никак повлиять нельзя, даже при оборачивании разбора в попытку эксепшн всё равно выводится в консоль.

В идеале желательно иметь информацию о характере проблемы при разборе и дополнительную поясняющую информацию.

Например пользователь пытается выполнить gitsync inir, Такой команды нет, парсер должен вернуть что-то вроде

  • Тип ошибки: Не найдена команда
  • Комментарий: "inir"

Что в вызываемом скрипте можно будет обработать и корректно оповестить пользователя.

Дело в том, что не все есть команда. Эту ситуауию парсер пытается обработать, как значение позиционного параметра.

Согласен, что уровень КритичнаяОшибка это перебор. Однако, это все же ошибка и о ней надо сообщить.

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

Вопрос, кто должен ругаться? Приложение или парсер?
Мы пишем приложение и знаем, что является ошибкой, а что нет. Парсер должен просто добросовестно выполнить свою работу и сообщить о всех трудностях, с которыми столкнулся в процессе разбора, а не принимать решение за приложение, что делать дальше.

Даже при наличии позиционных параметров нужно корректно отрабатывать ситуацию.

Пример тот же gitsync: Вводим команду gitsync inir /Путь/К/Хранилищу /Локальный/Каталог/Git

На выходе пользователь должен получить что-то вроде: Команда "inir" не найдена, и вывести это сообщение должен не cmdline, а само приложение. Может оно молча захочет вывести help, а может сообщит что-то, пукнет в динамик и тоже выведет help... или не выведет.

Я пока слабо представляю, как это можно исправить, пишу этот issue на будущее.

Команда "inir" не найдена, и вывести это сообщение должен не cmdline, а само приложение

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

Текст "Команда inir не найдена" должен сформировать именно cmdline.