Python предоставляет две очень важные функции, чтобы справиться с любой неожиданной ошибкой в программах на языке Python и добавить возможности их отладки:
Ниже приведен список стандартных исключений доступных в Python:
№ | Имя и Описание исключений |
---|---|
1 | Exception – Базовый класс для всех исключений |
2 | StopIteration – Возникает, когда метод next() цикла не указывает на какой-либо объект. |
3 | SystemExit – Вызываемая функция sys.exit(). |
4 | StandardError – Базовый класс для всех встроенных исключений, кроме StopIteration и SystemExit. |
5 | ArithmeticError – Базовый класс для всех ошибок, которые возникают для числовых расчетов. |
6 | OverflowError – Возникает, когда значение превышает максимальный предел для числового типа. |
7 | FloatingPointError – Возникает, когда расчет с плавающей точкой терпит неудачу. |
8 | ZeroDivisonError – Возникает при делении или по модулю нуля, имеет место для всех числовых типов. |
9 | AssertionError – Вызывается в случае выхода из строя заявления Assert. |
10 | AttributeError – Вызывается в случае выхода из строя ссылки на атрибут или назначения. |
11 | EOFError – Возникает, когда нет входного сигнала либо из raw_input () или функции inpud() и достигнут конец файла. |
12 | ImportError – Возникает, когда оператор import терпит неудачу. |
13 | KeyboardInterrupt – Возникает, когда пользователь прерывает выполнение программы, как правило, нажав Ctrl + C. |
14 | LookupError – Базовый класс для всех ошибок поиска. |
15 | IndexError – Возникает, когда индекс не найден в последовательности. |
16 | KeyError – Возникает, когда указанный ключ не найден в словаре. |
17 | NameError – Возникает, когда идентификатор не найден в локальных или глобальном пространстве имен. |
18 | UnboundLocalError – Возникает при попытке доступа к локальной переменной в функции или метода, но значение не было присвоено. |
19 | EnvironmentError – Базовый класс для всех исключений, которые происходят за пределами среды Python. |
20 | IOError – Возникает, когда операция ввода/вывода не работает, например, заявление для печати или функции Open() при попытке открыть файл, который не существует. |
21 | OSError – Вызывает ошибку, связанную с операционной системой. |
22 | SyntaxError – Возникает, когда есть ошибка в синтаксисе Python. |
23 | IndentationError – Возникает, когда не указаны правильно отступы. |
24 | SystemError – Возникает, когда интерпретатор находит внутреннюю проблему, но при возникновении этой ошибки интерпретатор Python не выходит. |
25 | SystemExit – Вызывается, когда интерпретатор Python выходит с помощью sys.функции exit(). Если код не обработан, переводчик завершает работу. |
26 | TypeError – Возникает при попытке операции или функции, недопустимой для указанного типа данных. |
27 | ValueError – Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения. |
28 | RuntimeError – Возникает, когда генерируется ошибка не попадающая ни в какую категорию. |
29 | NotImplementedError – Возникает, когда абстрактный метод, который должен быть реализован у унаследованного класса фактически не реализуется. |
Утверждение является осознанной проверкой, которую вы можете включить или выключить, когда вы проводите тестирование программы.
Когда встречается оператор assert, Python оценивает сопровождающие выражение, которое, мы надеемся, верно. Если выражение ложно, Python вызывает исключение AssertionError.
Синтаксис assert:
assert Expression[, Аргументы]
Если утверждение не удается, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключение AssertionError может быть перехвачено и обработано, как и любое другое исключение, используя заявление try-except. Если они не обработаны, они завершат программу и произведут обратную трассировку.
Вот функция, которая преобразует заданную температуру от градусов Кельвина до градусов по Фаренгейту. Так как 0° К это абсолютный 0, то получается, что функция вываливается, если он видит отрицательную температуру:
#!/usr/bin/python3 def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Холоднее абсолютного нуля!" return ((Temperature-273)*1.8)+32 print (KelvinToFahrenheit(273)) print (int(KelvinToFahrenheit(505.78))) print (KelvinToFahrenheit(-5))
Когда этот код выполниться, он выдаст следующий результат:
32.0 451 Traceback (most recent call last): File "test.py", line 9, in <module> print KelvinToFahrenheit(-5) File "test.py", line 4, in KelvinToFahrenheit assert (Temperature >= 0),"Холоднее абсолютного нуля!" AssertionError: Холоднее абсолютного нуля!
Исключением является событие, которое происходит во время выполнения программы, когда нарушается нормальный поток команд в программе. В общем случае, когда сценарий Python сталкивается с ситуацией, что он не может справиться с ним, он вызывает исключение. Исключение представляет собой объект Python, который представляет ошибку.
Когда сценарий Python вызывает исключение, он должен либо обработать исключение, сразу же, в противном случае он прекращает свою работу и завершает работу.
Если у вас есть какой-то подозрительный код, который может вызвать исключение, вы можете защитить свою программу путем размещения подозрительного кода в блоке try:. Блок try: включает в себя, заявление except:, следует блок кода, который обрабатывает проблему как можно элегантнее.
Вот простой синтаксис блоков try….except…else:
try: Вы делаете свою работу ...................... except ExceptionI: Если есть ExceptionI, то выполняется этот блок. except ExceptionII: Если есть ExceptionII, то выполняется этот блок. ...................... else: Если исключений нет, выполняется этот блок.
Вот несколько важных моментов, о вышеупомянутом синтаксисе:
Этот пример открывает файл, записывает содержимое в файл и выходит корректно, потому что нет никаких проблем:
#!/usr/bin/python3 try: fh = open("testfile", "w") fh.write("Это мой тестовый файл для обработки исключений!!") except IOError: print ("Ошибка: не удается найти файл или прочитать данные") else: print ("Запись содержимого в файл произведена успешно") fh.close()
Данный код выдаст следующий результат:
Запись содержимого в файл произведена успешно
В этом примере попытаемся открыть файл, в котором у вас нет разрешения на запись, поэтому он вызывает исключение:
#!/usr/bin/python3 try: fh = open("testfile", "r") fh.write("Это мой тестовый файл для обработки исключений!!") except IOError: print ("Ошибка: не удается найти файл или прочитать данные") else: print ("Запись содержимого в файл произведена успешно")
Данный код выдаст следующий результат:
Ошибка: не удается найти файл или прочитать данные
Вы можете также использовать заявление except без каких-либо исключений, определенных следующим образом:
try: Вы делаете свою работу ...................... except: Если есть какие-либо исключения, то выполняется этого блока. ...................... else: Если исключений нет, выполняется этот блок.
Этот вид заявления try-except перехватывает все исключения, которые происходят. Использование такого рода заявления try-except, не считается хорошей практикой программирования, потому что она ловит все исключения, но не дает программисту определить основную причину проблемы, которая может возникнуть.
Вы также можете использовать заявление except, для обработки нескольких исключений следующим образом:
try: Вы делаете свою работу ...................... except(Exception1[, Exception2[,...ExceptionN]]]): Если есть какое-либо исключение из данного списка исключений, то выполняется этот блок. ...................... else: Если исключений нет, выполняется этот блок.
Вы можете использовать блок finally: вместе с блоком try:. Блок finally: представляет собой место, куда можно поместить любой код, который должен выполнится, вызовет ли блок try исключение или нет. Синтаксис заявление try-finally следующий:
try: Вы делаете свою работу; ...................... Из-за каких-либо исключений, это может быть пропущено. finally: Это всегда будет исполнено. ......................
#!/usr/bin/python3 try: fh = open("testfile", "w") fh.write("Это мой тестовый файл для обработки исключений!!") finally: print ("Ошибка: не удается найти файл или прочитать данные") fh.close()
Если у вас нет разрешения на открытие файла в режиме записи, то это приведет к следующему результату:
Ошибка: не удается найти файл или прочитать данные
Тот же пример можно записать более аккуратно следующим образом:
#!/usr/bin/python3 try: fh = open("testfile", "w") try: fh.write("Это мой тестовый файл для обработки исключений!!") finally: print ("Собираюсь закрыть файл") fh.close() except IOError: print ("Ошибка: не удается найти файл или прочитать данные")
Когда исключение в блоке try выполниться, немедленно переходит к блоку finally. После того как все операторы в блоке finally выполнятся, то возбуждается исключение снова и обрабатывается заявление except, если присутствует в следующем более высокого уровня заявление try-except.
Исключение может иметь argument, который является значением, которое дает дополнительную информацию о проблеме. Содержание аргумента зависит от исключения. Вы фиксируете аргумент исключения, предоставляя переменную в предложении except следующим образом:
try: Вы делаете свою работу ...................... except ExceptionType as Argument: Значение аргумента можно напечатать здесь...
Если вы пишете код для обработки исключения, вы можете указать переменную, следующую за именем исключения в предложении except. Если вы перехватываете несколько исключений, вы можете иметь переменную в виде кортежа с исключениями.
Эта переменная получает значение исключения, в основном содержащего причину исключения. Переменная может получать одно или несколько значений в виде кортежа. Этот кортеж обычно содержит строку ошибки, номер ошибки и расположение ошибки.
Ниже приведен пример для одного исключения:
#!/usr/bin/python3 # Определить функцию. def temp_convert(var): try: return int(var) except ValueError as Argument: print ("Аргумент не содержит чисел\n", Argument) # Вызов функции выше здесь. temp_convert("xyz")
Данный код выдаст следующий результат:
Аргумент не содержит чисел invalid literal for int() with base 10: 'xyz'
Вы можете вызвать исключения несколькими способами, используя оператор raise. Общий синтаксис для заявления raise выглядит следующим образом:
raise [Exception [, args [, traceback]]]
Здесь Exception представляет собой тип исключения (например, NameError) и arg является значением для аргумента исключения. Аргумент является необязательным; если не прилагается, аргумента в исключении нет.
Последний аргумент, отслеживающий, также является необязательным (и редко используется на практике), и если он присутствует, отслеживающий объект используется для исключения.
Исключением может быть строка, класс или объект. Большинство исключений, создаваемых ядром Python, являются классами с аргументом, который является экземпляром класса. Определение новых исключений довольно легко и может быть сделано следующим образом:
def functionName( level ): if level <1: raise Exception(level) # Приведенный ниже код не будет выполнен # если мы вызовем исключение return level
Например, чтобы захватить исключение выше, мы должны написать пункт except следующим образом:
try: Бизнес-логика здесь... except Exception as e: Обработка исключений здесь e.args... else: Остальная часть кода здесь...
Следующий пример иллюстрирует использование средств исключения:
#!/usr/bin/python3 def functionName( level ): if level <1: raise Exception(level) # Приведенный ниже код не будет выполнен # если мы вызовем исключение return level try: l = functionName(-10) print ("level = ",l) except Exception as e: print ("ошибка в аргументе уровня",e.args[0])
Это выдаст следующий результат:
ошибка в аргументе уровня -10
Python также позволяет создавать свои собственные исключения путем вывода классов из стандартных встроенных исключений.
Вот пример, связанный с RuntimeError. Здесь, создается класс, как подкласс RuntimeError. Это полезно, когда вам нужно отобразить более конкретную информацию при перехвате исключения.
В блоке try , определенный пользователем возбуждаются исключение и ловится за блоком except. Переменная е используются для создания экземпляра класса NetworkError.
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
Поэтому, как только вы определили класс выше, вы можете вызвать исключение следующим образом:
try: raise Networkerror("Плохое имя хоста") except Networkerror,e: print e.args