Latest web development tutorials

Python3 błędy i wyjątki

Jako początkujący Pythona, tylko do nauki programowania Python często zobaczyć jakiś komunikat o błędzie, że nie wspomina się przed tym rozdziale będziemy poświęconej.

Python posiada dwie łatwo rozpoznawalne błąd: błędy składni i wyjątki.

błąd składni

Python błędy składniowe lub błędne wywołanie analityczna, początkujący często spotykamy, jako przykłady

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

W tym przykładzie, print () jest sprawdzany pod kątem błędów, zanim go brakuje dwukropka (:).

Parser zwrócił uwagę na błąd w swojej partii, w niewłaściwym miejscu, aby znaleźć pierwszy marker mała strzałka.

nienormalny

Nawet gramatyki Program Python jest poprawna, nadszedł czas, aby uruchomić, nie może być błędów. Runtime błędy wykryte nazywane są wyjątki.

Większość z nich nie będzie obsługi wyjątku w postaci komunikatów o błędach wystawie tutaj:

>>> 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

Pojawić się nieprawidłowy różnych typów tego typu są drukowane jako część informacji: Przykłady typów ZeroDivisionError, NameError i Błąd typu.

Przednia część komunikatu o błędzie pokazuje kontekst wyjątek występuje, stos wywołań i wyświetlane w postaci konkretnych informacji.

Obsługa wyjątków

Poniższy przykład, pozwala użytkownikom wprowadzić poprawną liczbę całkowitą, ale pozwala użytkownikowi na przerwanie programu (za pomocą Ctrl-C lub metod systemu operacyjnego na wyposażeniu). Przerwy użytkownika spowoduje wyjątek KeyboardInterrupt.

>>> while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")
   

spróbuj prace oświadczenie w następujący sposób;

  • Po pierwsze, klauzula try (pomiędzy słowami kluczowymi i hasła z wyjątkiem sprawozdania TRY)
  • Jeśli wystąpi żaden wyjątek, za wyjątkiem klauzuli jest ignorowany, spróbuj klauzula jest wykonywany końce.
  • Jeśli wystąpi wyjątek w procedurze klauzuli try, a następnie spróbuj klauzulę, reszta zostanie zignorowany. Jeśli nazwa i rodzaj wyjątkiem chyba po meczu, to odpowiadający za wyjątkiem klauzuli jest wykonywany. Kod spróbować oświadczenie po ostatniej egzekucji.
  • Jeśli wyjątek nie zgadza się z żadnym wyjątkiem, wyjątek ten zostanie przekazany do górnej próbie.

Oświadczenie try może zawierać więcej niż jeden z wyjątkiem klauzuli do czynienia z różnymi określonymi wyjątkami. Co najwyżej jeden oddział będzie wykonywany.

Handler tylko dla odpowiedniej klauzuli try przetwarzania raczej wyjątkiem niż druga obsługi wyjątku try.

Wyjątkiem klauzuli może obsługiwać wiele wyjątków, które zostaną umieszczone w nawiasach jako krotki, na przykład:

    except (RuntimeError, TypeError, NameError):
        pass

Ostatnim wyjątkiem klauzuli może zignorować nazwę wyjątku, będzie ona traktowana jako zamiennika. Można użyć tej metody, aby wydrukować komunikat o błędzie, a następnie ponownie wyrzucony.

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

spróbuj wyjątkiem stwierdzenie ma opcjonalny innego klauzulę, jeśli korzystasz z tej klauzuli, należy umieścić po wszystkich z wyjątkiem klauzul. Klauzula ta nie będzie miała żadnego problemu występuje w klauzuli try wykonuje. Na przykład:

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()

Użyj klauzuli innego niż wszystkie wypowiedzi w klauzuli try, który jest lepiej unikać niektóre nieoczekiwane, ale chyba się nie złapać wyjątek.

Obsługa wyjątków nie zajmuje się tylko tymi wyjątkami występują bezpośrednio spróbować klauzuli, ale także zadzwonić klauzuli uchwytu (nawet pośredniego wywołania funkcji), gdzie wyrzucane. Na przykład:

>>> 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

Wyjątek

Python używa instrukcji throw podnieść określony wyjątek. Na przykład:

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

podnosić tylko jeden parametr określa wyjątek do rzucania. To musi być niezwykłe instancją klasy lub nieprawidłowej (tj Exception podklasy).

Jeśli chcesz wiedzieć, czy zgłasza wyjątek, nie chce sobie z tym poradzić, to proste stwierdzenie może podnieść ponownie wyrzucony.

>>> 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

Wyjątki definiowane przez użytkownika

Możesz mieć swoje własne wyjątki, tworząc nową klasę wyjątku. Wyjątki powinny dziedziczyć z klasy Exception, bezpośrednio dziedziczenia, dziedziczenia lub pośrednio, na przykład:

>>> 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!'

W tym przykładzie klasa Exception domyślny __init __ () jest nadpisane.

Podczas tworzenia modułu mogą rzucić wiele nienormalnym powszechną praktyką jest, aby utworzyć klasę wyjątku bazą dla tego pakietu, a następnie na podstawie tej klasy bazowej, aby tworzyć różne podklasy dla różnych warunków błędu:

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

Większość nazw są wyjątkiem na "Error" na końcu, podobnie jak standardowy nazewnictwa jako nienormalne.


Zdefiniowane porządki zachowanie

Instrukcja try ma inną opcjonalną klauzulę, która określa się zachowanie czystości w żadnym wypadku wykona. Na przykład:

>>> try:
        raise KeyboardInterrupt
	finally:
        print('Goodbye, world!')
   
Goodbye, world!
KeyboardInterrupt

Niezależnie od powyższych przykładach spróbować klauzuli nie ma wyjątek występuje wreszcie klauzula jest wykonywany.

Jeśli wyjątek w klauzuli try (lub oprócz i inny punkt) został wyrzucony, ale nie ma żadnych oprócz tego, że zatrzymał się, to zostaną wskrzeszeni po końcu klauzula jest wykonywany.

Tutaj jest bardziej złożony przykład (zawarte w tej samej instrukcji w próbie wyjątkiem i wreszcie klauzula):

>>> 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'

Predefiniowane zachowanie porządki

Niektóre obiekty zdefiniować standardowe oczyszczenia zachowania, niezależnie od tego, czy system jest z powodzeniem stosowany kiedyś nie trzeba go, a następnie oczyścić to zachowanie standardowe jest wykonywany.

Ten przykład pokazuje ta strona próbuje otworzyć plik, a następnie wydrukować zawartość na ekranie:

for line in open("myfile.txt"):
    print(line, end="")

Powyższy problem z tym kodem jest, że kiedy skończył, plik pozostaje otwarty, a nie zamknięty.

Słowa kluczowe z rachunku mogą być gwarantowane obiekty takie jak pliki zostaną wykończone przy użyciu prawidłowego wykonywania jego metody oczyszczania:

with open("myfile.txt") as f:
    for line in f:
        print(line, end="")

Po zakończeniu wyżej kod, nawet jeśli problemów w procesie, plik F jest zamknięta.