Często nasze programy potrafi przerwać nieoczekiwany błąd… spowodowany albo zewnętrzną przyczyną, albo naszym niedopatrzeniem. Jednym ze sposobów eleganckiego “załatwienia” problemu jest przejęcie wywołania wyjątku i obsłużenie go w wybrany przez nas sposób.
Jednym z takich błędów może być np. brak pliku, z którego chcemy odczytać dane. Załóżmy, że nie byłoby możliwości obsługi wyjątków, uruchommy poniższy program i zaobserwujmy jego zachowanie.
plik=open("C:/Python/plikTestowy2.txt","r")
Uzyskaliśmy poniższy efekt1oczywiście zakładamy, że w podanej lokalizacji nie ma takiego pliku!:
Temat możemy spróbować rozwiązać w sposób programowy z wykorzystaniem modułu os w sposób przykładowy, przedstawiony poniżej:
import os if os.path.exists("plikTestowy2.txt"): plik=open("C:/Python/plikTestowy2.txt","r") else: print("Nie ma takiego pliku!")
Kolejnym sposobem jest użycie klauzury try-except
w celu przechwycenia wygenerowanego wyjątku. Patrząc na pierwszy przykład kodu, wyjątkiem generowanym jest: FileNotFoundError.
try: plik=open("C:/Python/plikTestowy2.txt","r") except FileNotFoundError: print("Nie znalazłem takiego pliku!") sys.exit(10) #chcemy wyjść z kodem wskazującym na błąd i opisanym w dokumentacji naszego programu
Klauzura ta ma znacznie więcej opcji, umożliwiając przechwytywanie różnych błędów, grup błędów oraz domyślną obsługę. Zainteresowanych odsyłam do dokumentacji Pythona.
try: plik=open("C:/plikTestowy.txt","r") except FileNotFoundError: print("Nie znalazłem takiego pliku!") sys.exit(10) #chcemy wyjść z kodem wskazującym na błąd i opisanym w dokumentacji naszego programu except Exception as e: print("Wystąpił nieoczekiwany błąd "+e.__str__()) finally: print("Domyślnie wywoływana procedura obsługi!")
Nazwy wyjątków pozyskujemy testując program… ale także możemy przewidzieć jakie błędy mogą być nieobsłużone w naszym programie przeglądając hierarchię wyjątków2dokumentacja wyjątków – link :
BaseException
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ExceptionGroup [BaseExceptionGroup]
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ ├── PythonFinalizationError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
│ ├── UnicodeDecodeError
│ ├── UnicodeEncodeError
│ └── UnicodeTranslateError
└── Warning
├── BytesWarning
├── DeprecationWarning
├── EncodingWarning
├── FutureWarning
├── ImportWarning
├── PendingDeprecationWarning
├── ResourceWarning
├── RuntimeWarning
├── SyntaxWarning
├── UnicodeWarning
└── UserWarning