Najlepszy samouczek Python3 błędy i wyjątki W 2024 r. W tym samouczku możesz dowiedzieć się błąd składni,nienormalny,Obsługa wyjątków,Wyjątek,Wyjątki definiowane przez użytkownika,Zdefiniowane porządki zachowanie,Predefiniowane zachowanie porządki,
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.
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.
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.
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;
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
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
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.
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'
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.