Найти - Пользователи
Полная версия: Несколько вопросов про исключения.
Начало » Python для новичков » Несколько вопросов про исключения.
1 2 3
Python_newbie13
У меня есть два вопроса.
Первый: насколько корректно использовать 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 прописать условия возникновения ошибки?
Rodegast
> насколько корректно использовать try, exception конструкцию, что бы продолжить выполнять код в котором ты знаешь, что есть ошибка.

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

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

Можно конечно написать что то вроде этого, но зачем?
  class CustomError(Exception):
      @classmethod
      def superAssert(cls, data):
           .....
           raise cls()
Python_newbie13
По первому спасибо. Примерно так я и сам думал. Т.е исключения стоит использовать исключительно в целях дебага,а не для решения проблем изначально кривого кривого кода?
А свои классы исключений стоит поднимать только при выполнении заранее заданных условий, что бы понять какая именно ошибка произошла, если стандартных не хватает?
Есть ли другие варинанты использования?
Rodegast
> Т.е исключения стоит использовать исключительно в целях дебага,

Нет, в целях “дебага” нужно использовать отладчик.
Romissevd
Тебе принципиально использование исключений? Используй 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'))
Python_newbie13
Нет мне не принципиально. Я и через while сделал, но там реально кривой код. Просто хотелось бы понять для чего использовать исключения? Спасибо за вариант через for.

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


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

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

Вполне себе рабочая конструкция!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB