14.1.1 Ogólna koncepcja błędów i obsługi wyjątków

const ERROR = 1;
const OK = 0;

int zapisz_do_pliku(nazwa_pliku){
  int status;
  status = zapisz_preferencje(nazwa_pliku);
  if (status == ERROR) {
    ... obsłuż błąd
  }
  status = zapisz_tekst(nazwa_pliku);
  if (status == ERROR) {
    ... obsłuż błąd
  }
  status = zapisz_formaty(nazwa_pliku);
  if (status == ERROR) {
    ... obsłuż błąd
  }
  .
  .
  .
}

int zapisz_tekst(nazwa_pliku){
  int status;
  status = wywołanie funkcji niższego poziomu, która zapisuje tekst;
  if (status == ERROR) {
    return ERROR;
  }
  status = wywołanie funkcji niższego poziomu, która zapisuje tekst;
  if (status == ERROR) {
    return ERROR;
  }
  .
  .
  .
}


def zapisz_do_pliku(nazwa_pliku):
  try: # spróbuj wykonać kod poniżej
      zapisz_tekst(nazwa_pliku)
      zapisz_formaty(nazwa_pliku)
      zapisz_preferencje(nazwa_pliku)
  .
  .
  .
  except: # dopuść wystąpienie błędu braku miejsca na dysku i wtedy zrób to:
      …obsłuż błąd…


def zapisz_tekst(nazwa_pliku):
  ...wywołanie funkcji niższego poziomu, która zapisuje rozmiar tekstu...
  ...wywołanie funkcji niższego poziomu, która zapisuje tekst...
  .
  .
  .


14.2.2 Zgłaszanie wyjątków

>>> lista = [1, 2, 3]
>>> element = lista[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range


>>> raise IndexError("taki żarcik")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: taki żarcik

14.2.3 Łapanie i obsługa wyjątków

try:
  treść
except typ_wyjatku1 as zmienna1:
  kod_obsługi1
except typ_wyjatku2 as zmienna2:
  kod_obsługi2
.
.
.
except:
  domyślny_kod_obsługi
else:
  treść_warunkowa
finally:
  blok_końcowy

14.2.4 Definiowanie nowych wyjątków

class MójWyjątek(Exception):
  pass


try:
  raise MójWyjątek("Informacja o tym, co poszło nie tak")
except MójWyjątek as błąd:
  print("Sytuacja: ", błąd)



try:
  raise MójWyjątek("Jakaś informacja", "nazwa_pliku", 3)
except MójWyjątek as błąd:
  print("Sytuacja: {0} odnośnie pliku {1} \nkod błędu: {2}".format(błąd.args[0], błąd.args[1], błąd.args[2]))


>>> raise MójWyjątek("Informacja o tym, co poszło nie tak")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__MójWyjątek:  Informacja o tym, co poszło nie tak


Sytuacja:  Jakaś informacja odnośnie pliku nazwa pliku
kod błędu: 3

14.2.5 Debugowanie programów przy użyciu instrukcji assert

>>> x = (1, 2, 3)
>>> assert len(x) > 5, 'len(x) not > 5'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: len(x) not > 5

14.2.6 Hierarchia dziedziczenia wyjątków 

try:
  treść
except LookupError as błąd:
  kod wyjątku
except IndexError as błąd:
  kod wyjątku

14.2.8 Przykład: wyjątki w zwykłych przeliczeniach

def wartość_komórki(tekst):
  try:
    return float(string)
  except ValueError:
    if tekst == "":
      return 0
    else:
      return None


def bezpiecznie_oblicz(funkcja, x, y, arkusz):
  try:
    return funkcja(x, y, arkusz)
  except TypeError:
    return None

14.3 Managery kontekstu i słowo kluczowe with

try:
  plik_wejściowy = open(nazwa_pliku)
  dane = plik_wejściowy.read()
finally:
  plik_wejściowy.close()



with open(nazwa_pliku) as plik_wejściowy:
  dane = plik_wejściowy.read()
