Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2020 16:58:51

Python_newbie13
Зарегистрирован: 2020-06-27
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

У меня есть два вопроса.
Первый: насколько корректно использовать 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'))
Этот код преобразовывает строку в список строк, которые состоят или из цифр или из всего остального.
Сам код заранее ошибочен. Потому что на последнем элементе всегда будет IndexError. Try except позволяет выполнить это, но насколько это корректно?
2ой вопрос.
Я хочу создать свое исключение.
 class CustomError(Exception):
      pass
Можно ли в самом классе CustomError прописать условия возникновения ошибки?

Отредактировано Python_newbie13 (Июнь 30, 2020 16:59:32)

Офлайн

#2 Июнь 30, 2020 19:03:01

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

> насколько корректно использовать try, exception конструкцию, что бы продолжить выполнять код в котором ты знаешь, что есть ошибка.

Если есть ошибка, то её нужно исправлять а не ставить костыли.

> Можно ли в самом классе CustomError прописать условия возникновения ошибки?

Можно конечно написать что то вроде этого, но зачем?

  class CustomError(Exception):
      @classmethod
      def superAssert(cls, data):
           .....
           raise cls()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 30, 2020 19:03:54)

Офлайн

#3 Июнь 30, 2020 19:28:26

Python_newbie13
Зарегистрирован: 2020-06-27
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

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

Отредактировано Python_newbie13 (Июнь 30, 2020 19:34:48)

Офлайн

#4 Июнь 30, 2020 20:42:00

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

> Т.е исключения стоит использовать исключительно в целях дебага,

Нет, в целях “дебага” нужно использовать отладчик.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июнь 30, 2020 21:05:14

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Тебе принципиально использование исключений? Используй 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)

Офлайн

#6 Июнь 30, 2020 21:50:20

Python_newbie13
Зарегистрирован: 2020-06-27
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Нет мне не принципиально. Я и через while сделал, но там реально кривой код. Просто хотелось бы понять для чего использовать исключения? Спасибо за вариант через for.

Я понимаю это так. Есть большая программа 10000 строк кода, много классов и т.д. Прогонять всю программу через дебагер - это очень такое себе. Во время проектирования ты думаешь, где и как может произойти косяк. Собственно там задаешь условия когда этот косяк происходит и поднимаешь определенное исключение при их выполнении.Это тебе покажет точнее. Потом уже идет очередь дебаггера.
Возможно я не прав. Тогда вообще никаких идей зачем они нужны.

Отредактировано Python_newbie13 (Июнь 30, 2020 22:41:05)

Офлайн

#7 Июнь 30, 2020 23:39:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Возможно я не прав
Не прав в корне.
Вот смотри, есть у тебя стандартная библиотека, которую ты нещадно эксплуатируешь. Например, есть модуль datetime, который как не трудно догадаться, предоставляет множество удобных функций для работы с датой. Давай попробуем написать вот такой код
 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

Так вот этот модуль кто-то написал, он не богом дан. И ты тоже можешь написать свою реализацию такого же точно модуля. Но товарищ, который реализовывал библиотечную функцию задался вопросом: “а как собственно должна себя вести функция, если её пользователь попробует создать дату с несуществующим в календаре месяцем?”. А никак она не должна себя дальше вести, она должна породить исключение, потому что это исключительная ситуация и недопустимое поведение. О чем позаботился разработчик и дал тебе внятное сообщение об ошибке. Если бы модуль datetime не обрабатывал исключительные ситуации, то вместо “month must be in 1..12” ты бы получил что-нибудь совершенно непонятно в строке 5909 непонятного тебе модуля, например какой-нибудь KeyError, и ты бы неделю пытал интернеты, а что собственно за фигня.
Если в твоей программе есть места, в которых может случится непредвиденное поведение, до программа должна сообщить об ошибке. Это и есть исключение. Если твоя программа читает XML-файл и создает какой-то отчет, что должно случиться, если в файле находятся неизвестные парсеру тэги? Очевидно, надо прервать парсинг и сообщить об этом в доступном виде.

Есть большая программа 10000 строк кода, много классов и т.д. Прогонять всю программу через дебагер - это очень такое себе.
Если часть программы написана на Си, то можно только пожелать удачи в дебаггенге.


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



Отредактировано FishHook (Июнь 30, 2020 23:41:50)

Офлайн

#8 Июнь 30, 2020 23:52:42

Python_newbie13
Зарегистрирован: 2020-06-27
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Спасибо пример с datetime очень нагляден.

Отредактировано Python_newbie13 (Июль 1, 2020 00:04:00)

Офлайн

#9 Июль 1, 2020 20:11:52

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Чаще всего исключения используются как “защита от дурака”. Наглядный пример с datetime от FishHook. Обычно, при разработке какой-либо функции, модуля или класса в него закладываются какие-то возможности работы с каими-либо типами данных, объектами и т.д. Всё что выходит за рамки “компетенции” разрабатываемой функции, модуля, класса должно выдавать исключения типа “извини, браток, это не моя компетенция, я работаю только с тем-то и тем-то”
или типа “Ты ушёл за пределы дозволенных границ” (см. исключение для строки, когда пытаешься извлечь символ по индексу, превышающему её длину), ну и т.д. и т.п.
Для начала и получения наглядных примеров посмотри, по документации, виды исключений для встроенных типов.

Офлайн

#10 Июль 2, 2020 09:44:13

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2580
Репутация: +  58  -
Профиль   Отправить e-mail  

Несколько вопросов про исключения.

Все вышесказанное верно.
Однако есть банальный пример. Мы хотим убедиться что на ввод приходит именно число.
Пусть для примера будет:

 for i in range(0,2):
    try:
        number = int(input())
        ...
    except:
        print("This is not number")

Вполне себе рабочая конструкция!



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version