Найти - Пользователи
Полная версия: Несколько вопросов про исключения.
Начало » Python для новичков » Несколько вопросов про исключения.
1 2 3
FishHook
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 
Python_newbie13
Спасибо теперь понятно
4kpt_V
Rodegast
Это точно из “дзена”? Я не помню что там было что-то такое написано.
Нет. Это сказала генерал армии США. Разработчика кобола.
Rodegast
> Нет. Это сказала генерал армии США

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

FishHook
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
Python_newbie13
А если в вашем примере я хочу передать пользователю, например, на какой операций была произведена ошибка?
FishHook
Python_newbie13
А если в вашем примере я хочу передать пользователю, например на какой операции была произведена ошибка?
В моем примере нет опреций, в которых “произведена ошибка”
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