Как красиво обработывать ошибки для пользователя, в процессе выполнения скрипта Python?
Извиняюсь заранее за тупой вопрос, и в гугле не забанили, но возможно я не совсем правильно понимаю "название проблемы", поэтому ничего и не нахожу. Короче...
Есть большой и сложный скрипт на питоне, который до выдачи результата, делает много всего самого разного разнообразного (чтение\запись в файлы\БД, запросы к API, скачивание\закачивание файлов на FTP и прочие манипуляции). Скрипт писал я сам, параллельно изучая питон, для одной рабочей рутинной задачки, и все даже получилось. По ходу выполнения скрипт может "сломаться" во множествах местах (на входе файл не того формата, в файле невалидные данные, нет интернета, не удалось скачать \ закачать файл и т.д). Пока я работал со скриптом один, это не вызывало никаких проблем, ведь я сам все писал, и все ошибки знаю и почему они возникают и что делать. Теперь понадобилось поделится скриптом с коллегами.
Собственно вопрос. Пока писал свой скрипт, вообще не копал в сторону обработки ошибок\логирования. То есть как сделать так, чтобы скрипт не просто крашился и выдавал аброкадабру (с точки зрения того кто не шарит), а писал что то разумное и понятное. Может быть есть какие-то мануалы\статьи\книги хорошие на эту тему?
1. Исключения try except.
2. Логирование.
3. Если нет возможности подробно описывать ошибки в самом скрипте, то пишите коды ошибок, а на стороннем ресурсе (едином для всех) описывайте, что означают эти коды.
Т.к. в реальном мире все возможные варианты не предусмотреть, то предлагаю использовать 3 вариант + предложение отправить ошибку в поддержку за вознаграждение, в итоге поимеем:
- Относительно недорого тестера.
- Относительно довольного пользователя (получил какой то бонус + ткнул носом целого разраба).
Как красиво обработывать ошибки для пользователя, в процессе выполнения скрипта Python?
Никак, пользователь не должен получать ошибок от программы. Любое исключение - это баг, т. е. непредвиденное стечение обстоятельств, т.е. программист не доработал программу/совершил ошибку либо пользователь не дочитал инструкцию.
Единственный допустимый случай - валидация ввода пользователя. Ваша программа проверяет, например введённое число, и, если оно отрицательное, выводит сообщение об этом и либо завершается, либо запрашивает повторный ввод.
Особый случай - Ctrl+C, называется KeyboardInterrupt.
Речь не о багах, а о кривых руках в процессе выполенния.
Например:
1. Загрузил csv неверного формата.
2. Оборвался интернет в процессе работы скрипта и результата не будет.
3. Не удалось считать файл с диска, потому что в ожидаемой папке его нет.
Все эти проблемы на стороне пользователя, и об этих проблемах ему нужно сказать.
Максим Д., лучше писать что-то вроде "ошибка 123, ~/1.log". А ещё лучше вообще не пытаться маскировать исключения, которые и так достаточно подробно выводятся. Если программист делает "грязный подгузник", то он берёт на себя ответственность за обработку абсолютно всех ошибок, в том числе ошибок доступа, файлов, segfault, антивируса и т.п., потому что стэктрейс и оригинальная ошибка безнадёжно утеряны.
sergey4kin, это называется документацией оператора. Но если вы рассчитываете, что опльзователь тупой, то можно:
1) провести валидацию файла
2)
except Exception as e:
raise RuntimeError('Problema s internetom') from e # обязательно from e
3) аналогично п. 2, только текст другой
Все эти проблемы на стороне пользователя, и об этих проблемах ему нужно сказать.
Поскольку проблемы на стороне пользователя, даже не пытайтесь их как-то обработать. Просто добавьте описание или выведите сообщения, никак не трогая оригинальное исключение.
sergey4kin, на всякий случай поясню, что исключения нужны, чтобы вы потом выкатили багфикс. А это очень сложно сделать, если у пользователя всё сломалось, а в логах написано только: "Оборвался интернет в процессе работы скрипта."
Griboks, вы в целом, копаете слишком глубоко как мне кажется. Скрипт не ракету запускает на Марс. Если скрипт не смог что-то сделать, то моему пользователю будет достаточно об этом просто так и написать, а что конкретно не так (залагал 4g интернет, или его включить забыли) - пользователь уже сам разберется. Те кто будут вместо меня этим скриптом пользоваться, не настолько тупые. В чем то даже умнее, просто питон знаю только я и всего то. За примеры спасибо.