poprzedni temat | w górę | następny temat

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

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

  2. Napisz funkcję, która przyjmuje obiekt wyjątku i wypisuje stos wywołań funkcji w miejscu wystąpienia wyjątku.

  3. Utwórz za pomocą virtualenv własne środowisko. Doinstaluj do niego pakiet pep8 i sprawdź zgodność własnych skryptów ze standarderm pep8.

poprzedni temat | w górę | następny temat