Форум сайта python.su
У меня есть два вопроса.
Первый: насколько корректно использовать try, exception конструкцию, что бы продолжить выполнять код в котором ты знаешь, что есть ошибка. Например:
def transformation(expression): char_list = [] parsed_string = [] for i in expression: char_list.append(i) print(char_list) while char_list: try: s = '' print(parsed_string) while char_list[0].isdigit(): s = s + char_list.pop(0) parsed_string.append(s) s = '' while not char_list[0].isdigit(): s = s + char_list.pop(0) parsed_string.append(s) except IndexError: print('everything ok') parsed_string.append(s) parsed_string.remove('') return parsed_string print(transformation('blablabla23la31'))
class CustomError(Exception): pass
Отредактировано Python_newbie13 (Июнь 30, 2020 16:59:32)
Офлайн
> насколько корректно использовать try, exception конструкцию, что бы продолжить выполнять код в котором ты знаешь, что есть ошибка.
Если есть ошибка, то её нужно исправлять а не ставить костыли.
> Можно ли в самом классе CustomError прописать условия возникновения ошибки?
Можно конечно написать что то вроде этого, но зачем?
class CustomError(Exception): @classmethod def superAssert(cls, data): ..... raise cls()
Отредактировано Rodegast (Июнь 30, 2020 19:03:54)
Офлайн
По первому спасибо. Примерно так я и сам думал. Т.е исключения стоит использовать исключительно в целях дебага,а не для решения проблем изначально кривого кривого кода?
А свои классы исключений стоит поднимать только при выполнении заранее заданных условий, что бы понять какая именно ошибка произошла, если стандартных не хватает?
Есть ли другие варинанты использования?
Отредактировано Python_newbie13 (Июнь 30, 2020 19:34:48)
Офлайн
> Т.е исключения стоит использовать исключительно в целях дебага,
Нет, в целях “дебага” нужно использовать отладчик.
Офлайн
Тебе принципиально использование исключений? Используй for вместо while… Как пример
def transformation(expression): parsed_string = [] char_list = list(expression) print(char_list) num = letter = '' for symbol in char_list: if symbol.isdigit(): num += symbol if letter: parsed_string.append(letter) letter = '' else: letter += symbol if num: parsed_string.append(num) num = '' if letter: parsed_string.append(letter) if num: parsed_string.append(num) return parsed_string print(transformation('b1'))
Отредактировано Romissevd (Июнь 30, 2020 21:05:34)
Офлайн
Нет мне не принципиально. Я и через while сделал, но там реально кривой код. Просто хотелось бы понять для чего использовать исключения? Спасибо за вариант через for.
Я понимаю это так. Есть большая программа 10000 строк кода, много классов и т.д. Прогонять всю программу через дебагер - это очень такое себе. Во время проектирования ты думаешь, где и как может произойти косяк. Собственно там задаешь условия когда этот косяк происходит и поднимаешь определенное исключение при их выполнении.Это тебе покажет точнее. Потом уже идет очередь дебаггера.
Возможно я не прав. Тогда вообще никаких идей зачем они нужны.
Отредактировано Python_newbie13 (Июнь 30, 2020 22:41:05)
Офлайн
Возможно я не правНе прав в корне.
import datetime d = datetime.datetime(2000, 14, 3) print(d)
Traceback (most recent call last):
File "<string>", line 4, in <module>
ValueError: month must be in 1..12
Есть большая программа 10000 строк кода, много классов и т.д. Прогонять всю программу через дебагер - это очень такое себе.Если часть программы написана на Си, то можно только пожелать удачи в дебаггенге.
Отредактировано FishHook (Июнь 30, 2020 23:41:50)
Офлайн
Спасибо пример с datetime очень нагляден.
Отредактировано Python_newbie13 (Июль 1, 2020 00:04:00)
Офлайн
Чаще всего исключения используются как “защита от дурака”. Наглядный пример с datetime от FishHook. Обычно, при разработке какой-либо функции, модуля или класса в него закладываются какие-то возможности работы с каими-либо типами данных, объектами и т.д. Всё что выходит за рамки “компетенции” разрабатываемой функции, модуля, класса должно выдавать исключения типа “извини, браток, это не моя компетенция, я работаю только с тем-то и тем-то”
или типа “Ты ушёл за пределы дозволенных границ” (см. исключение для строки, когда пытаешься извлечь символ по индексу, превышающему её длину), ну и т.д. и т.п.
Для начала и получения наглядных примеров посмотри, по документации, виды исключений для встроенных типов.
Офлайн
Все вышесказанное верно.
Однако есть банальный пример. Мы хотим убедиться что на ввод приходит именно число.
Пусть для примера будет:
for i in range(0,2): try: number = int(input()) ... except: print("This is not number")
Офлайн