# Plik nestexc.py

# -*- coding: utf-8 -*-
def action2( ):
   print 1 + [ ]                             # Wygenerowanie wyjątku TypeError

def action1( ):
   try:
      action2( )
   except TypeError:                         # Najbardziej aktualna pasująca instrukcja try
      print 'wewnętrzne try'

try:
   action1( )
except TypeError:                            # Tutaj tylko jeśli action1 ponownie zgłasza wyjątek
   print 'zewnętrzne try'

% python nestexc.py
wewnętrzne try


try:
   try:
      action2( )
   except TypeError:                         # Najbardziej aktualna pasująca instrukcja try
      print 'wewnętrzne try'
except TypeError:                            # Tutaj tylko jeśli action1 ponownie zgłasza wyjątek
   print 'zewnętrzne try'


>>> try:
...    try:
...       raise IndexError
...    finally:
...       print 'mielonka'
... finally:
...    print 'MIELONKA'
...
mielonka
MIELONKA
Traceback (most recent call last):
   File "<stdin>", line 3, in ?
IndexError


# Plik except-finally.py

def raise1( ): raise IndexError
def noraise( ): return
def raise2( ): raise SyntaxError

for func in (raise1, noraise, raise2):
   print '\n', func
   try:
      try:
         func( )
      except IndexError:
         print 'przechwycono IndexError'
   finally:
      print 'wykonano finally'


% python except-finally.py

<function raise1 at 0x00BA2770>
przechwycono IndexError
wykonano finally

<function noraise at 0x00BB47F0>
wykonano finally

<function raise2 at 0x00BB4830>
wykonano finally

Traceback (most recent call last):
   File "C:/Python25/except-finally.py", line 9, in <module>
      func( )
   File "C:/Python25/except-finally.py", line 3, in raise2
      def raise2( ): raise SyntaxError
SyntaxError: None


while 1:
   try:
      line = raw_input( )                    # Wczytanie wiersza ze stdin
   except EOFError:
      break                                  # Wyjście z pętli na końcu pliku
   else:
      ...przetwarzanie kolejnego wiersza...


class Found(Exception): pass

def searcher( ):
   if ...sukces...:
      raise Found( )
   else:
      return

try:
   searcher( )
except Found:                                # Wyjątek, jeśli element został odnaleziony
   ...sukces...
else:                                        # else zwracane, kiedy element nie został odnaleziony
   ...porażka...


class Failure(Exception): pass

def searcher( ):
   if ...sukces...:
      return ...znalezionyelement...
   else:
      raise Failure( )

try:
   item = searcher( )
except Failure:
   ...zgłoszenie...
else:
   ...tutaj wykorzystanie elementu...


try:
   ...wykonanie programu...
except:                                      # Wszystkie nieprzechwycone wyjątki trafiają tutaj
   import sys
   print 'nie przechwycono!', sys.exc_info( )[0], sys.exc_info( )[1]


# Plik testdriver.py

import sys
log = open('testlog', 'a')
from testapi import moreTests, runNextTest, testName

def testdriver( ):
   while moreTests( ):
      try:
         runNextTest( )
      except:
         print >> log, 'PORAŻKA', testName( ), sys.exc_info( )[:2]
      else:
         print >> log, 'SUKCES', testName( )
testdriver( )


def func( ):
   try:
      ...                                    # Tu zgłaszany jest wyjątek IndexError
   except:
      ...                                    # Jednak wszystko trafia tu i się zatrzymuje

try:
   func( )
except IndexError:                           # Wyjątek powinien być przetworzony tutaj
   ...


# Plik exiter.py
   
# -*- coding: utf-8 -*-
import sys

def bye( ):
   sys.exit(40)                              # Kluczowy błąd - zakończenie!

try:
   bye( )
except:
   print 'mam go'                            # Oj - zignorowaliśmy wyjście
print 'kontynuuję...'


% python exiter.py
mam go
kontynuuję...   
   
   
mydictionary = {...}
...
try:
   x = myditctionary['mielonka']             # Oj - błąd w pisowni
except:
   x = None                                  # Zakłada, że mamy KeyError   
...kontynuujemy z x...


try:
   ...
except (myerror1, myerror2):                 # Przestaje działać po dodaniu myerror3
   ...                                       # Nie-błędy
else:
   ...                                       # Zakładamy, że jest błędem


try:
   ...
except SuccessCategoryName:                  # Będzie OK, jeśli dodamy podklasę myerror3
   ...                                       # Nie-błędy
else:
   ...


>>> ex1 = 'Hiszpańska Inkwizycja'
>>> ex2 = 'Hiszpańska Inkwizycja'

>>> ex1 == ex2, ex1 is ex2
(True, False)


>>> try:
...    raise ex1
... except ex1:
...    print 'mam go'
...
mam go


>>> try:
...    raise ex1
... except ex2:
...    print 'Mam go'
...
Traceback (most recent call last):
   File "<pyshell#43>", line 2, in <module>
      raise ex1
Hiszpańska Inkwizycja


>>> try:
...    raise 'jajka'
... except 'jajka':
...    print 'mam go'
...
mam go


>>> try:
...    raise 'jajka' * 8
... except 'jajka' * 8:
...    print 'mam go'
...
Traceback (most recent call last):
   File "<pyshell#58>", line 2, in <module>
      raise 'jajka' * 8
jajkajajkajajkajajkajajkajajkajajkajajka