Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2020 11:10:01

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

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

Python_newbie13
Вот вы сами себе и ответили.
Когда вы не знаете заранее, что может произойти исключительная ситуация (заранее неизвестно какие действия будет выполнять прогирамма), то перехват исключений хорошая практика. Когда вы знаете, что имеено происходит, то ваша задача избежать исключтительных ситуаций. Другими словами, использовать механизм исключений допустимо для ситуаций, когда вы не можете предсказать последствия вызова кода, и недопустимо использовать его для управления потоком выполнения.

Так делать можно

 def calculate(a, b):
    func = get_random_func()
    try:
         res = func(a, b)
    except Exception:     
         ....

А вот так нет
 def calculate(a, b, z):
    try:
        c = a / (b - z)
    except ZeroDivisionError:
        try:
            c = math.sqrt(a + b)
        except ValueError:
            c = 0 



Офлайн

#2 Июль 7, 2020 13:13:33

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

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

Спасибо теперь понятно

Офлайн

#3 Июль 9, 2020 00:53:33

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

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

Rodegast
Это точно из “дзена”? Я не помню что там было что-то такое написано.
Нет. Это сказала генерал армии США. Разработчика кобола.

Офлайн

#4 Июль 9, 2020 12:01:02

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

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

> Нет. Это сказала генерал армии США

Ага, тогда лучше на это забить.



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

Офлайн

#5 Июль 9, 2020 15:29:38

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

Rodegast
Это точно из “дзена”? Я не помню что там было что-то такое написан
Пардонте, дейстивтельно перепутал, это не из дзена, но всеже.. https://docs.python.org/3/glossary.html#term-eafp
FishHook
и я хоть убей не понимаю, почему исключения тут - боллее питоник. Хотите быть конкретными - давайте конкретные примеры. А в предложенном варианте - не убедительно.
Ну вопервых, это всего лишь ИМХО , а во вторых пример уж очень обобщенный:
  try:
    проверка корня
 except ZeroDivisionError:
     удалить корень из списка
если вместо “проверка корня” чтонить типа (a+b)/x то разницы вроде никакой, а если там будет каканить формула позаковыристее где операций деления больше двух, то тут уже замаешься проверять, хотя опять же все ситуативно.
в останом конечно согласен что :
FishHook
использовать механизм исключений допустимо для ситуаций, когда вы не можете предсказать последствия вызова кода, и недопустимо использовать его для управления потоком выполнения.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Июль 9, 2020 18:20:31

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

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

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

    
x = 1
y = 2
z = 3
k = 0
def calc():
    return x + y ** 3 / ((x - 2 / z) + 1 / k ** 2)
calc()
И теперь у тебя cлучился ZeroDivision. В какой операции деления?
Сообщение об ошибке не поможет найти проблему
   
C:\Python27\python.exe D:/tests/test.py
Traceback (most recent call last):
File "D:/tests/test.py", line 10, in <module>
calc()
File "D:/tests/test.py", line 8, in calc
return x + y ** 3 / ((x - 2 / z) + 1 / k ** 2)
ZeroDivisionError: integer division or modulo by zero

Process finished with exit code 1

Нормальный человек напишет вот так, если он не враг самому себе
 def calc():
    a = x - 2 / z
    b = 1 / k ** 2
    c = y ** 3
    d = a + b
    return x + c / d
calc()

теперь мы знаем, какая именно операция лажанула

 C:\Python27\python.exe D:/tests/test.py
Traceback (most recent call last):
  File "D:/tests/test.py", line 14, in <module>
    calc()
  File "D:/tests/test.py", line 9, in calc
    b = 1 / k ** 2
ZeroDivisionError: integer division or modulo by zero

И тут у меня возникнет вопрос, а нахрена все это оборачивать в try…except? Мне кажется, код здорового человека будет выглядеть как то так
 def calc():
    if z == 0:
        raise FormulaError('z is 0')
    if k == 0:
        raise FormulaError('k is 0')
    a = x - 2 / z
    b = 1 / k ** 2
    c = y ** 3
    d = a + b
    if d == 0:
        raise FormulaError('d is 0')
    return x + c / d



Отредактировано FishHook (Июль 9, 2020 18:26:36)

Офлайн

#7 Июль 10, 2020 15:52:21

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

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

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

Отредактировано Python_newbie13 (Июль 10, 2020 18:08:32)

Офлайн

#8 Июль 10, 2020 16:17:05

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

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

Python_newbie13
А если в вашем примере я хочу передать пользователю, например на какой операции была произведена ошибка?
В моем примере нет опреций, в которых “произведена ошибка”



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version