Лучшее руководство по Python3 ошибки и исключения в 2024 году. В этом руководстве вы можете изучить Ошибка синтаксиса,ненормальный,Обработка исключений,Сгенерирует исключение,Определяемые пользователем исключения,Определено зачистка поведение,Предопределенные поведение зачистка,
Как новичок Python, просто изучая программирования Python часто видим какое-то сообщение об ошибке, мы не упоминали в начале данной главы мы будет посвящена.
Python имеет две легко узнаваемые ошибки: синтаксические ошибки и исключения.
Python синтаксические ошибки или неправильно аналитический вызов, новички часто сталкиваются, в качестве примеров
>>> while True print('Hello world') File "<stdin>", line 1, in ? while True print('Hello world') ^ SyntaxError: invalid syntax
В этом примере, функция печати () проверяется на наличие ошибок, прежде чем он отсутствует двоеточие (:).
Parser указал на ошибку своей партии, и в том месте, чтобы найти первый маркер маленькая стрелка.
Даже грамматика программа Python правильно, пришло время для запуска, могут быть ошибки. Ошибки времени выполнения Обнаруженные называются исключениями.
Большинство из них не будет обработчик исключений в виде ошибки отображения сообщений здесь:
>>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: Can't convert 'int' object to str implicitly
Появляются ненормальные в различных типах, эти типы печатаются как часть информации: Примеры типов ZeroDivisionError, NameError и TypeError.
Передняя часть сообщения об ошибке показывает контекст исключения происходит, стек вызовов и отображаются в виде определенной информации.
В следующем примере, позволяет пользователям вводить действительное число, но позволяет пользователю прервать программу (с помощью Control-C или методы операционной системы, при условии). Пользовательские прерывания вызовет исключение KeyboardInterrupt.
>>> while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("Oops! That was no valid number. Try again ")
попробовать выписки работает следующим образом;
Заявление попытка может содержать более одного пункта, за исключением того, чтобы иметь дело с различными конкретными исключениями. По большей мере одной ветви будет выполняться.
Обработчик только для соответствующей обработки п попытка исключения, а не другой обработчик исключений попытка.
За исключением пункта может обрабатывать несколько исключений, которые будут помещены в круглых скобках в виде кортежа, например:
except (RuntimeError, TypeError, NameError): pass
Исключением последнего пункта, может игнорировать имя исключения, он будет рассматриваться в качестве шаблона. Вы можете использовать этот метод для вывода сообщения об ошибке, а затем снова выброшен.
import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error: {0}".format(err)) except ValueError: print("Could not convert data to an integer.") except: print("Unexpected error:", sys.exc_info()[0]) raise
попробуйте, за исключением личных данных имеет необязательный другое положение, если вы используете эту статью, должен быть помещен после того, как все, за исключением положений. Это положение не будет иметь каких-либо проблем происходит в операторе попытка выполняется. Например:
for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
Используйте предложение еще, чем все заявления в пункте Ьгу что лучше, чтобы избежать некоторых неожиданных, но за исключением того, что они не поймать исключение.
Обработка исключений не только иметь дело с теми исключениями, возникают непосредственно попробовать положение, но и вызвать пункт обработчика (даже косвенные вызовы функций), где брошенный. Например:
>>> def this_fails(): x = 1/0 >>> try: this_fails() except ZeroDivisionError as err: print('Handling run-time error:', err) Handling run-time error: int division or modulo by zero
Python использует перекидной заявление поднять указанное исключение. Например:
>>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: HiThere
поднять только один параметр указывает исключение быть выброшен. Он должен быть необычным экземпляром класса или аномальное (т.е. подкласса Exception).
Если вы хотите знать, если он вызывает исключение, не хочет иметь дело с ним, то простое утверждение может поднять его снова выбросили.
>>> try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: HiThere
Вы можете иметь свои собственные исключения путем создания нового класса исключения. Исключения должны наследовать от класса Exception, либо непосредственно наследования, правопреемства или косвенно, например:
>>> class MyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) >>> try: raise MyError(2*2) except MyError as e: print('My exception occurred, value:', e.value) My exception occurred, value: 4 >>> raise MyError('oops!') Traceback (most recent call last): File "<stdin>", line 1, in ? __main__.MyError: 'oops!'
В этом примере, класс исключений по умолчанию __init __ () перезаписывается.
При создании модуля может бросить множество ненормальных обычной практикой является создание базового класса исключения для этого пакета, а затем на основе этого базового класса для создания различных подклассов для различных условий ошибок:
class Error(Exception): """Base class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the error """ def __init__(self, expression, message): self.expression = expression self.message = message class TransitionError(Error): """Raised when an operation attempts a state transition that's not allowed. Attributes: previous -- state at beginning of transition next -- attempted new state message -- explanation of why the specific transition is not allowed """ def __init__(self, previous, next, message): self.previous = previous self.next = next self.message = message
Большинство имен являются исключением "ошибка" в конце, так же, как стандартный нейминга как ненормальная.
попытка заявление имеет еще одно необязательное условие, которое определяет поведение очистки при любых обстоятельствах будет выполнять. Например:
>>> try: raise KeyboardInterrupt finally: print('Goodbye, world!') Goodbye, world! KeyboardInterrupt
Вне зависимости от приведенных выше примеров попробовать положение, есть не происходит исключение, в конце концов условие выполняется.
Если исключение в операторе Ьгу (или за исключением того и другого пункта) был выброшен, но не имеют какой-либо, кроме его остановить, то это будет снова поднят после того, как, наконец, предложение выполняется.
Вот более сложный пример (содержится в том же заявлении, в попытке за исключением того, и, наконец, пункт):
>>> def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally: print("executing finally clause") >>> divide(2, 1) result is 2.0 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in divide TypeError: unsupported operand type(s) for /: 'str' and 'str'
Некоторые объекты определяют стандартное поведение очистки, независимо от того, будет ли система успешно используется когда-то это не нужно, а затем очистить это стандартное поведение выполняется.
Этот пример показывает, как эта сторона пытается открыть файл, а затем распечатать содержимое на экране:
for line in open("myfile.txt"): print(line, end="")
Выше проблема с этим кодом в том, что, когда закончите, файл остается открытым, а не закрытым.
может быть гарантировано Ключевые слова с утверждением объекты, такие как файлы будут выполнены с использованием правильного исполнения его методами очистки:
with open("myfile.txt") as f: for line in f: print(line, end="")
После того, как приведенный выше код завершения, даже если проблемы в процессе, файл F всегда замкнут.