Анимация
JavaScript
|
Главная Библионтека 8.3 Обработка исключений Вы можете писать программы, которые будут обрабатывать определенные исключения. Посмотрите на следующий пример, в котором пользователю будет выдаваться приглашение до тех пор, пока не будет введено целое число или выполнение не будет прервано (обычно Ctrl-c). Во втором случае генерируется исключение KeyboardInterrupt. >>> while 1: ... try: ... x = int(raw input( ... "Введите, пожалуйста, целое число: ")) ... break ... except ValueError: ... print "Вы ошиблись. Попробуйте еш;е раз..." Инструкция try работает следующим образом. • Сначала выполняется ветвь try (инструкции, находящиеся между ключевыми словами try и except). File "<stdin>", line 1 ZeroDivisionError: integer division or modulo >>> 4 + spam*3 Traceback (innermost last): File "<stdin>", line 1 NameError: spam >>> 2 +2 Traceback (innermost last): File "<stdin>", line 1 TypeError: illegal argument type for built-in operation Последняя строка сообщения показывает, что произошло. Исключения бывают разного типа - он выводится в сообщении. Типы исключений в приведенном примере: ZeroDivisionError, NameError и TypeError. Имена стандартных исключений являются встроенными идентификаторами, но не являются зарезервированными ключевыми словами. Сразу после типа выводятся подробности возникновения исключения. Предшествующая часть сообщения об ошибке показывает контекст возникновения исключительной ситуации в форме содержимого стека. При этом выводятся строки исходного текста, за исключением строк, читаемых со стандартного ввода. В главе 13 перечислены все встроенные исключения и их назначение. • Если не возникает исключительной ситуации, ветвь except пропускается и выполнение инструкции try завершается. • Если во время выполнения ветви try генерируется исключение, оставшаяся часть ветви пропускается. Далее, если тип (класс) исключения соответствует указанному после ключевого слова except, выполняется ветвь except и выполнение инструкции try завершается. • Если исключение не соответствует указанному после ключевого слова except, то оно передается внешнему блоку try или, если обработчик не найден, исключение считается не перехваченным, выполнение прерывается и выводится сообщение об ошибке. Инструкция try может иметь более одной ветви except, определяя обработчики для разных исключений. Выполняться будет (как максимум) только один из них. Обрабатываются только исключения, сгенерированные в соответствующей ветви try, но не в других обработчиках инструкции try. После ключевого слова except может быть указано несколько типов исключений в виде кортежа: ... except (RuntimeError, TypeError, NameError): ... pass В последней ветви except тип исключения может быть опущен - в этом случае будут обрабатываться все исключения. Используйте такую запись с особой осторожностью - так Вы легко можете замаскировать реальные ошибки! Перехват всех исключений можно использовать для вывода сообщения об ошибке, а затем повторно сгенерировать его (позволяя обрабатывать исключение в другом месте): import sys try: f = open(myfile.txt) s = f.readlineO i = int(s.strip()) except IOError, exc: print "Ошибка ввода/вывода", exc except ValueError: print "Не могу преобразовать данные к целому типу." except: print "Неожиданная ошибка:", sys.exc info()[0] raise # повторно генерирует последнее # перехваченное исключение После всех ветвей except, инструкция try может содержать ветвь else, которая будет выполняться в случае, если во время выполнения ветви try исключения не генерируются. Например: >>> try: ... spam() ... except NameError, x: ... print Имя, x, не определено Имя spam не определено Если исключение не обрабатывается, значение исключения выводится в сообщении об ошибке после имени класса исключения. Обработчик перехватывает не только исключения, сгенерированные непосредственно в блоке try, но и в вызываемых из него функциях. Например: >>> def this fails(): ... x = 1/0 >>> try: ... this fails() ... except ZeroDivisionError, exc: ... print Ошибка времени выполнения:, exc Ошибка времени выполнения: integer division or modulo for arg in sys.argv[1:]: try: f = open(arg, r) except IOError: print Не могу открыть, arg else: print arg, содержит, len(f.readlines()), \ строк f.closeO Обычно лучше использовать ветвь else, чем добавлять код в основную ветвь инструкции try, так как это позволяет избежать обработки исключений, сгенерированных кодом, который Вы вовсе не собирались защищать. Исключение может иметь ассоциированное с ним значение - аргумент, переданный классу исключения при инициализации. Наличие и тип аргумента зависит от типа исключения. Ассоциированное значение используется при получении для исключения строкового значения. Чтобы получить значение исключения, в ветви except после класса исключения (или кортежа классов) укажите переменную: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [ 20 ] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |