| title | Отладка Python - Шпаргалка по Python |
|---|---|
| description | В программировании отладка — это процесс поиска и устранения ошибок (дефектов или проблем, препятствующих корректной работе) в компьютерных программах, программном обеспечении или системах. |
| labUrl | https://labex.io/ru/labs/python-python-debugging-633653?course=python-cheatsheet |
Исключения вызываются с помощью оператора raise. В коде оператор raise состоит из следующего:
- Ключевое слово
raise - Вызов функции
Exception() - Строка с полезным сообщением об ошибке, переданная в функцию
Exception()
# оператор raise: вручную вызвать исключение с пользовательским сообщением
raise Exception('This is the error message.')Traceback (most recent call last):
File "<pyshell#191>", line 1, in <module>
raise Exception('This is the error message.')
Exception: This is the error message.
A. throw
B. raise
C. error
D. exception
Ключевое слово raise используется для ручного вызова исключения в Python. Вы можете вызывать встроенные исключения или пользовательские исключения.
Обычно код, который вызывает функцию, а не сама функция, знает, как обработать исключение. Поэтому вы часто увидите оператор raise внутри функции, а операторы try и except — в коде, вызывающем функцию.
# Вызов исключений в функции, обработка их в вызывающем коде
def box_print(symbol, width, height):
if len(symbol) != 1:
raise Exception('Symbol must be a single character string.')
if width <= 2:
raise Exception('Width must be greater than 2.')
if height <= 2:
raise Exception('Height must be greater than 2.')
print(symbol * width)
for i in range(height - 2):
print(symbol + (' ' * (width - 2)) + symbol)
print(symbol * width)
# Обработка исключений при вызове функции
for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):
try:
box_print(sym, w, h)
except Exception as err: # Перехват исключения и вывод сообщения об ошибке
print('An exception happened: ' + str(err))****
* *
* *
****
OOOOOOOOOOOOOOOOOOOO
O O
O O
O O
OOOOOOOOOOOOOOOOOOOO
An exception happened: Width must be greater than 2.
An exception happened: Symbol must be a single character string.
Подробнее об Обработке исключений.
Трассировка (traceback) отображается Python всякий раз, когда вызванное исключение остается необработанным. Но ее также можно получить в виде строки, вызвав traceback.format_exc(). Эта функция полезна, если вам нужна информация из трассировки исключения, но вы также хотите, чтобы блок except корректно обработал исключение. Вам потребуется импортировать модуль traceback Python перед вызовом этой функции.
# traceback.format_exc(): получить трассировку как строку для логирования/отладки
import traceback
try:
raise Exception('This is the error message.')
except:
with open('errorInfo.txt', 'w') as error_file:
error_file.write(traceback.format_exc()) # Записать трассировку в файл
print('The traceback info was written to errorInfo.txt.')116
The traceback info was written to errorInfo.txt.
Число 116 — это возвращаемое значение метода write(), поскольку в файл было записано 116 символов. Текст traceback был записан в errorInfo.txt.
Traceback (most recent call last):
File "<pyshell#28>", line 2, in <module>
Exception: This is the error message.
Утверждение — это проверка здравого смысла, чтобы убедиться, что ваш код не делает ничего заведомо неправильного. Эти проверки здравого смысла выполняются операторами assert. Если проверка здравого смысла не пройдена, вызывается исключение AssertionError. В коде оператор assert состоит из следующего:
- Ключевое слово
assert - Условие (т.е. выражение, которое возвращает
TrueилиFalse) - Запятая
stringдля отображения, когда условие равноFalse
# оператор assert: проверить условие, вызвать AssertionError, если False
pod_bay_door_status = 'open'
assert pod_bay_door_status == 'open', 'The pod bay doors need to be "open".' # Проходит
pod_bay_door_status = 'I\'m sorry, Dave. I\'m afraid I can\'t do that.'
assert pod_bay_door_status == 'open', 'The pod bay doors need to be "open".' # Вызывает AssertionErrorTraceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
assert pod_bay_door_status == 'open', 'The pod bay doors need to be "open".'
AssertionError: The pod bay doors need to be "open".
assert завершается неудачей?
A. Программа продолжает выполнение
B. Выводится предупреждение
C. Вызывается AssertionError, и программа должна аварийно завершиться
D. Условие исправляется автоматически
Когда оператор assert завершается неудачей, он вызывает AssertionError. В отличие от исключений, операторы assert не следует перехватывать с помощью try-except; если assert не проходит, ваша программа должна аварийно завершиться, чтобы помочь вам быстро найти ошибки.
Проще говоря, оператор assert гласит: «Я утверждаю, что это условие истинно, а если нет, то где-то в программе есть ошибка». В отличие от исключений, ваш код не должен обрабатывать операторы assert с помощью try и except; если assert не проходит, ваша программа должна аварийно завершиться. Такой быстрый отказ сокращает время между первопричиной ошибки и первым обнаружением ошибки. Это уменьшит объем кода, который вам придется проверять, прежде чем найти код, вызывающий ошибку.
Утверждения можно отключить, передав опцию -O при запуске Python.
Чтобы модуль logging отображал сообщения журнала на экране по мере выполнения вашей программы, скопируйте следующее в начало вашей программы:
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s- %(message)s')logging в Python?
A. Запись информации о выполнении программы для отладки и мониторинга
B. Предотвращение возникновения ошибок
C. Ускорение выполнения программы
D. Шифрование сообщений журнала
Модуль logging позволяет записывать информацию о выполнении вашей программы на разных уровнях (DEBUG, INFO, WARNING, ERROR, CRITICAL), что полезно для отладки и мониторинга.
Предположим, вы написали функцию для вычисления факториала числа. В математике факториал 4 равен 1 × 2 × 3 × 4, или 24. Факториал 7 равен 1 × 2 × 3 × 4 × 5 × 6 × 7, или 5040. Откройте новое окно редактора файлов и введите следующий код. В нем есть ошибка, но вы также добавите несколько сообщений журнала, чтобы помочь себе выяснить, что идет не так. Сохраните программу как factorialLog.py.
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s- %(message)s')
logging.debug('Start of program')
def factorial(n):
logging.debug('Start of factorial(%s)' % (n))
total = 1
for i in range(0, n + 1):
total *= i
logging.debug('i is ' + str(i) + ', total is ' + str(total))
logging.debug('End of factorial(%s)' % (n))
return total
print(factorial(5))
logging.debug('End of program')2015-05-23 16:20:12,664 - DEBUG - Start of program
2015-05-23 16:20:12,664 - DEBUG - Start of factorial(5)
2015-05-23 16:20:12,665 - DEBUG - i is 0, total is 0
2015-05-23 16:20:12,668 - DEBUG - i is 1, total is 0
2015-05-23 16:20:12,670 - DEBUG - i is 2, total is 0
2015-05-23 16:20:12,673 - DEBUG - i is 3, total is 0
2015-05-23 16:20:12,675 - DEBUG - i is 4, total is 0
2015-05-23 16:20:12,678 - DEBUG - i is 5, total is 0
2015-05-23 16:20:12,680 - DEBUG - End of factorial(5)
0
2015-05-23 16:20:12,684 - DEBUG - End of program
Уровни логирования предоставляют способ категоризировать ваши сообщения журнала по важности. Существует пять уровней логирования, описанных в Таблице 10-1 от наименее до наиболее важных. Сообщения могут быть занесены в журнал на каждом уровне с использованием разной функции логирования.
| Уровень | Функция логирования | Описание |
|---|---|---|
DEBUG |
logging.debug() |
Самый низкий уровень. Используется для мелких деталей. Обычно вас интересуют эти сообщения только при диагностике проблем. |
INFO |
logging.info() |
Используется для записи информации об общих событиях в вашей программе или для подтверждения того, что все работает в нужной точке программы. |
WARNING |
logging.warning() |
Используется для указания на потенциальную проблему, которая не мешает работе программы, но может сделать это в будущем. |
ERROR |
logging.error() |
Используется для записи ошибки, из-за которой программа не смогла что-то сделать. |
CRITICAL |
logging.critical() |
Самый высокий уровень. Используется для указания на фатальную ошибку, которая вызвала или вот-вот вызовет полную остановку работы программы. |
A. INFO
B. WARNING
C. ERROR
D. DEBUG
Уровни логирования от самого низкого к самому высокому: DEBUG, INFO, WARNING, ERROR, CRITICAL. DEBUG — самый низкий уровень, используемый для подробной диагностической информации.
После того как вы отладили свою программу, вы, вероятно, не захотите, чтобы все эти сообщения журнала загромождали экран. Функция logging.disable() отключает их, чтобы вам не приходилось вручную удалять все вызовы логирования в вашей программе.
import logging
logging.basicConfig(level=logging.INFO, format=' %(asctime)s -%(levelname)s - %(message)s')
logging.critical('Critical error! Critical error!')2015-05-22 11:10:48,054 - CRITICAL - Critical error! Critical error!
logging.disable(logging.CRITICAL)
logging.critical('Critical error! Critical error!')
logging.error('Error! Error!')Вместо отображения сообщений журнала на экране вы можете записать их в текстовый файл. Функция logging.basicConfig() принимает именованный аргумент filename, вот так:
import logging
logging.basicConfig(filename='myProgramLog.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')A. Использовать logging.file()
B. Передать параметр filename в logging.basicConfig()
C. Использовать logging.write()
D. Журналы всегда записываются в файлы автоматически
Чтобы записать сообщения журнала в файл, передайте параметр filename в logging.basicConfig(). Это запишет все сообщения журнала в указанный файл вместо отображения их на экране.
- Обработка исключений
- breakpoint()