Wyjątki i virtualenv
Wyjątki
W przypadku, gdy w czasie działania programu występuje błąd, wyrzucany jest wyjątek, na przykład:
# dzielenie przez zero 1/0 ————————————————————————— ZeroDivisionError Traceback (most recent call last) <ipython-input-1-05c9758a9c21> in <module>() —-> 1 1/0 ZeroDivisionError: integer division or modulo by zero # odwołanie do nieistniejącego w słowniku klucza d = {} print d['klucz'] ————————————————————————— KeyError Traceback (most recent call last) <ipython-input-4-87c830e5a07a> in <module>() —-> 1 print d['klucz'] KeyError: 'klucz' # próba otwarcia nieistniejącego pliku with open('COMMAND.COM') as f: print f.read() ————————————————————————— IOError Traceback (most recent call last) <ipython-input-2-100b94601dcf> in <module>() —-> 1 with open('COMMAND.COM') as f: 2 print f.read() 3 IOError: [Errno 2] No such file or directory: 'COMMAND.COM'
Nie zawsze jesteśmy w stanie uchronić się przed wystąpieniem błędu.
Jednak jeśli zostanie zgłoszony wyjątek i nie będzie obsłużony,
działanie programu zostanie przerwane.
Wyjątki obsługujemy za pomocą składni try-except
(przykład z oficjalnej dokumentacji):
<< 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 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'
W powyższym przykładzie widać, że został obsłużony tylko jeden rodzaj wyjątków.
Dlatego nieobsłużony wyjątek TypeError
spowodował zakończenie programu.
Listę wszystkich klas standardowych wyjątków
można znaleźć na stronie
dokumentacji.
Jeśli po słowie except
wystąpi
klasa bazowa, to w tym miejscu zostaną obsłużone wszystkie
wyjątkie tej klasy i klas dziedziczących po niej.
Zgłaszanie wyjątku
Aby zgłosić wyjątek, używamy instrukcji raise
:
raise ValueError('Value is incorrect: {}, should be `int`'.format(str(type(x))))
virtualenv
virtualenv
jest programem, który umożliwia utworzenie środowiska dla języka Python z wybranymi wersjami bibliotek,
niezależnie od ich instalacji w systemie operacyjnym.
Każdy użytkownik systemu operacyjnego
może mieć nawet wiele różnych środowisk virtualenv
, pomiędzy którymi można się przełączać.
virtualenv env_proj_1 # ... # środowisko env_proj_1 utworzone - powstał katalog env_proj_1 # aktywacja środowiska: source env_proj_1/bin/activate # teraz można doinstalować pakiet potrzebny # dla tego konkretnego projektu, np.: pip install requests # po zakończeniu pracy: deactivate
Zadania
-
Napisz klasę, której obiekt będzie przechowywać adres e-mail. Konstruktor ma przyjmować napis, będący adresem. Jeśli zostanie podany niewłaściwy adres, konstruktor ma zgłaszać wyjątek odpowiedniej klasy — zdecyduj, jakiej.
-
Napisz funkcję, która przyjmuje obiekt wyjątku i wypisuje stos wywołań funkcji w miejscu wystąpienia wyjątku.
-
Utwórz za pomocą
virtualenv
własne środowisko. Doinstaluj do niego pakietpep8
i sprawdź zgodność własnych skryptów ze standardermpep8
.