Latest web development tutorials

Python3 ошибки и исключения

Как новичок 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 всегда замкнут.