Рубрики
Без рубрики

30 дней Python 👨💻 – 14-й день – обработка ошибок

Программа не идеальна. Если это не главная программа Worldo, написанная с большой осторожностью 😃 Сегодня я исследовал … Теги с Python, Challenge.

Программа не идеальна. Если это не главная программа Worldo, написанная с большой осторожностью 😃

Сегодня я рассмотрел все о обработке ошибок в Python. которые я постараюсь объяснить в простых и простых словах. Обработка ошибок, вероятно, являются наиболее важными понятиями программирования.

Все приложения склонны к ошибкам a.k.a или исключения. Ошибки не злые. Ошибки большую часть времени передают полезные сообщения, когда программа не выполняется или выполняется по любой причине. Это может быть случайная привязка ошибки, может быть, приложение не в сети, а она пытается получить доступ к Интернету. Может быть, есть ошибка при расчете, или, возможно, программа заканчивается из памяти. Есть много возможных ошибок, которые могут произойти, когда мы пишем программу. Когда обнаружена ошибка, программа просто завершается. Это может или не может не то, что мы хотим. А не Ожидание Код для запуска без ошибок, тем лучше и более прагматичный подход – обрабатывать ошибки и соответственно принимать некоторые действия.

В Python ошибки могут быть широко сегментированы на два синтаксических ошибка и исключения.

Синтаксисные ошибки возникают, когда мы пишем код Python, который переводчик Python не может подтвердить в качестве правильного кода Python.

print('A grave mistake) # Missing end quote. Will result in a syntax error
def hello # Missing :, will result in syntax error
    print('hello')

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

Интересная часть о другой ошибке, которая может произойти отдельно от ошибки синтаксиса.

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

age = input('Enter your age')
if age > 18:
  print('You are an adult')
else:
  print('You are a minor')

Запуск этого простого кода приведет к исключению.

Traceback (most recent call last):
  File "main.py", line 2, in 
    if age > 18:
TypeError: '>' not supported between instances of 'str' and 'int'

Исключение является типором, потому что значение возраста является строкой. Итак, чтобы предотвратить его, возраст должен быть выбран или преобразован в целое число.

age = int(input('Enter your age'))
if age > 18:
  print('You are an adult')
else:
  print('You are a minor')

Теперь, если пользователь предоставляет строковое значение вместо номера, будет еще одно исключение.

Enter your age asdf
Traceback (most recent call last):
  File "main.py", line 1, in 
    age = int(input('Enter your age'))
ValueError: invalid literal for int() with base 10: 'asdf'

Попробуйте за исключением блока

Для предотвращения такой ошибки Python предоставляет пытаться кроме блок, где действие помещено внутри попробуйте блокировать И если есть исключение, кроме Блок будет выполнен.

Как сравнение, в JavaScript Вселенная, есть пытаться поймать блокировать. Python просто имеет другое имя для поймать Отказ Функциональность точно такая же.

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')

Остальное блок

Помимо пытаться кроме Блок, Python также предоставляет еще Блок, который выполняется, если нет исключения в пытаться кроме Блок кода. Это расширение для пытаться кроме утверждение.

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')
else:
  print('Thank You!')

Наконец-то блок

Часто во время написания программы мы хотели бы выполнить действие независимо от того, было ли исключение или нет. Примером можно отправить сообщения журнала на сервер. Python предоставляет Наконец блок как часть пытаться кроме Блок, который выполняется, есть ли или нет исключение.

try:
  age = int(input('Enter your age'))
  if age > 18:
    print('You are an adult')
  else:
    print('You are a minor')
except:
  print('Invalid value provided')
finally:
  print('Sendiing dummy log to server') # always gets printed

Встроенные исключения

Python предоставляет много встроенных исключений, которые в основном экземпляры класса Baseexception.

Python встроенные исключения

Эти классы исключения могут использоваться для обработки определенных исключений, таких как Типеррр , ValueError, SystemerRor и Т. Д.

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  sum = reduce(lambda acc, curr: acc + curr, number_list)
  average = sum/len(number_list)
  return average

print(calc_average([1,2,3,4,5])) # 3.0

# Passing invalid arguments would result in errors
print(calc_average(['1','2','3','4','5'])) # TypeError
print(calc_average(None)) # TypeError
print(calc_average(3/0)) # ZeroDivisionError

Чтобы сделать функцию более оборонительными, мы можем поймать (обрабатывать) те конкретные исключения.

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except TypeError:
    print('Only a list of numbers is valid')


print(calc_average('hello world')) # Only a list of numbers is valid

Приведенный выше код обрабатывает недействительные аргументы. Однако в самом логике могут быть дефекты. Это также может быть обработано с использованием отдельных кроме блоки

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    1.0/0 # Bug
    return average
  except TypeError:
    print('Only a list of numbers is valid')
  except ZeroDivisionError:
    print('cannot divide by zero')


print(calc_average([1,2,3,4,5])) # cannot divide by zero'

Несколько исключений можно обрабатывать вместе в одном, кроме блока, а также

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except (TypeError, ZeroDivisionError): # handles both cases
    print('Only a list of numbers is valid')

print(calc_average(['asdfasdf'])) # Only a list of numbers is valid

Код, написанный выше, обрабатывает возможные исключения, но он скрывает полезные ошибки трассировки стека, предоставляемые интерпретатором, который сообщает точную, какую строку отвечает за код.

Фактическое сообщение об ошибке, а также пользовательское сообщение об ошибке можно комбинировать вместе.

from functools import reduce

def calc_average(number_list):
  '''
  accepts a list of numbers and returns average
  '''
  try:
    sum = reduce(lambda acc, curr: acc + curr, number_list)
    average = sum/len(number_list)
    return average
  except TypeError as type_error:
    print(f'Only a list of numbers is valid {type_error}')
  except ZeroDivisionError as zero_div_error:
    print(f'cannot divide by zero {zero_div_error}')  

print(calc_average('hello world')) 
# Only a list of numbers is valid unsupported operand type(s) for /: 'str' and 'int'

Это делает сообщения об ошибках более полезными. Также возможно повысить пользовательскую ошибку на основе некоторого состояния с использованием поднять Ключевое слово в Python

name = input('Enter your name')
if name.lower() == 'god':
  raise('Name cannot be GOD!')
else:
  print(name)

Невозможно запомнить все встроенные классы исключения Python, если вы не самые экономические!

Встроенные исключения Python DOC могут использоваться в качестве ссылки для обработки желаемых исключений.

использованная литература

  1. https://realpython.com/python-exceptions/
  2. https://www.programiz.com/python-programming/exception-handling
  3. https://docs.python.org/3/tutorial/errors.html

Это все на сегодня! Важная тема исследована, которая действительно помогает в написании более устойчивого кода Python. Завтра я исследую еще одну продвинутую тему Python – генераторы.

Иметь отличный!

Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-14-handling-errors-35g1”