| ||||||||||||||||
| ||||||||||||||||
| ||||||||||||||||
Глава 8. Ошибки и исключения До сих пор сообщения об ошибках только упоминались, но если Вы опробовали приведенные нами примеры, то, вероятно, Вы их видели. Существует (по крайней мере) две различные разновидности ошибок: синтаксические ошибки и исключения. 8.1 Синтаксические ошибки Синтаксические ошибки, также известные как ошибки разбора, возможно, будут чаще всего возникать пока Вы еще изучаете Python: >>> while 1 print ‘Привет, мир’ File "<stdin>", line 1 while 1 print ‘Привет, мир’ ^ SyntaxError: invalid syntax >>> Разборщик повторяет соответствующую строку и выводит маленькую "стрелку", указывающую на позицию в строке, где была обнаружена ошибка. Ошибка была вызвана словом, предыдущим стрелке: в примере, ошибка обнаружена на ключевом слове 8.2 Исключения Даже если оператор или выражение синтаксически корректно, может возникнуть ошибка при попытке их исполнения. Ошибки, обнаруженные во время выполнения, называются исключениями, и не являются безусловно фатальными: Вы скоро научитесь их обрабатывать в Python программах. Однако, большинство исключений программно не обрабатываются, и результат - сообщение об ошибке, как показано ниже: >>> 10*(1/0) Traceback (innermost last): File "<stdin>", line 1 ZeroDivisionError: integer division or modulo 14 >>> 4+spam*3 Traceback (innermost last): File "<stdin>"", line 1 NameError: spam 15 >>> ‘2’+2 Traceback (innermost last): File "<stdin>", line 1 TypeError: illegal argument type for built-in operation 16 >>> Последняя строка сообщения об ошибке дает знать, что случилось. Ошибки возникают различных типов, и тип выводится как часть сообщения: в примере мы увидели типы Остаток строки является деталью, толкование которой зависит от типа исключения. Предыдущая часть сообщения об ошибке показывает контекст, где возникло исключение, в форме обратного прохода стека. Обычно, эта часть содержит список строк обратного прохода стека; однако, строки, прочитанные со стандартного ввода, не будут печататься. Список встроенных исключений и их значения даются в "Справочном руководстве Python" 17 . 8.3 Обработка исключений Существует возможность написания программ, обрабатывающих некоторые исключения. Посмотрите на нижеследующие примеры, которые выводят таблицу обратных для нескольких чисел с плавающей точкой: >>> numbers=[0.3333,2.5,0,10] >>> for x in numbers: ... print x, ... try: ... print 1.0/x ... except ZeroDivisionError: ... print ‘*** не имеет обратного числа ***’ ... 0.3333 3.00030003 2.5 0.4 0 *** не имеет обратного числа *** 10 0.1 >>> Оператор
Оператор ... except (RuntimeError, TypeError, NameError): ... pass Последний пункт Когда возникает исключение, оно может иметь некоторое ассоциированное значение, также известное как аргумент исключения. Для тех типов исключений, которые имеют аргументы, пункт >>> try: ... spam() ... except NameError, x: ... print ‘имя’, x, ‘не определено’ ... имя spam не определено >>> Если исключение имеет аргумент, то он выводится как последняя часть ("деталь") сообщения необработанного исключения. Обработчики исключений обрабатывают не только те, которые возникли непосредственно в секции >>> def this_fails(): ... x=1/0 ... >>> try: ... this_fails() ... except ZeroDivisionError, detail: ... print ‘Обработанная ошибка времени выполнения:’,detail ... Обработанная ошибка времени выполнения: integer division or modulo >>> 8.4 Генерация исключений Оператор >>> raise NameError, ‘HiThere’ Traceback (innermost last): File "<stdin>", line 1 NameError: HiThere >>> Первый аргумент 8.5 Исключения, определяемые пользователем Программы могут именовать свои собственные исключения путем присваивания строки некоторой переменной. Например: >>> my_exc=’мое_исключение’ >>> try: ... raise my_exc, 2*2 ... except my_exc, val: ... print ‘Возникло мое исключение, значение:’, val ... Возникло мое исключение, значение: 4 >>> raise my_exc, 1 Traceback (innermost last): File "<stdin>", line 1 мое_исключение: 1 >>> Многие стандартные модули пользуются этим способом для того, чтобы сообщать об ошибках, возникающих в определенных внутри них функциях. 8.6 Определение завершающих действии Оператор >>> try: ... raise KeyboardInterrupt ... finally: ... print ‘Прощай, мир!’ ... Прощай, мир! Traceback (innermost last): File "<stdin>", line 2 KeyboardInterrupt >>> Пункт Оператор [Назад][Содержание][Вперед] |
|
| ||||||||||||||||
|