Belirli istisnaları ele alan programlar yazmak mümkündür. Aşağıdaki örnek,
kullanıcıdan geçerli bir tamsayı girilene kadar kullanıcıdan giriş yapması
istenir. Control-C tuş kombinasyonu (ya da işletim sisteminin desteklediği
başka bir kombinasyon) ile kullanıcı programdan çıkabilir. Kullanıcın sebep
olduğu bu olay ise KeyboardInterrupt istisnasının
oluşmasına neden olur.
>>> while True:
... try:
... x = int(raw_input("Lütfen bir rakam giriniz: "))
... break
... except ValueError:
... print "Bu geçerli bir giriş değil. Tekrar deneyin..."
...
try deyimi aşağıdaki gibi çalışır:
Önce try bloğu (try ve
except arasındaki ifade(ler)) işletilir.
Hiçbir istisna oluşmaz ise except bloğu atlanır
ve try deyimin icrası son bulur.
Eğer try bloğu içinde bir istisna oluşur ise
bloğun geri kalanı atlanır. İstisnanın türü except
anahtar kelimesinden sonra kullanılan ile aynı ise try
bloğunun kalan kısmı atlanır ve except bloğu
yürütülür. Programın akışı try ... except kısmından
sonra gelen ilk satırdan devam eder.
Adı except bloğunda geçmeyen bir istisna oluşur
ise üst seviyedeki try ifadelerine geçirilir; ancak
bunu ele alan bir şey bulunmaz ise bu bir ele alınmamış istisna olur ve
yürütme işlemi yukarıda da görüldüğü gibi bir hata mesajı ile son bulur.
Bir try deyimi farklı istisnaları yakalayabilmek için
birden fazla except bloğuna sahip olabilir. Bir
except bloğu parantez içine alınmış bir liste ile birden
fazla istisna adı belirtebilir. Örnek:
... except (RuntimeError, TypeError, NameError):
... pass
Son except bloğu istisna adı belirtilmeden de
kullanılıp herhangi bir istisnayı yakalayabilir. Bunu çok dikkatli
kullanın, çünkü çok ciddi bir programlama hatasını bu şekilde gözden
kaçırabilirsiniz! Bu özellik bir hata mesajı bastırıp ve tekrar bir
istisna oluşturarak çağıranın istisnayı ele almasını da sağlamak için
kullanılabilir:
import string, sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(string.strip(s))
except IOError, (errno, strerror):
print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
try ... except ifadesinin seçimlik else
bloğu da vardır. Bu her except bloğunun ardına yazılır ve
try bloğunun istisna oluşturmadığı durumlarda icra
edilmesi gereken kod bulunduğu zaman kullanılır. Örnek:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print 'cannot open', arg
else:
print arg, 'has', len(f.readlines()), 'lines'
f.close()
else bloğu kullanmak try bloğuna
ek satırlar eklemekten iyidir çünkü bu try ... except
ifadesi tarafından korunan kodun oluşturmadığı bir istisnanın kazara
yakalanmasını engeller.
Bir istisna meydana geldiğinde istisna argümanı olarak bilinen bir değer
de bulunabilir. Argümanın varlığı ve türü istisnanın türüne bağlıdır.
Argümanı olan istisna türleri için except bloğunda
istisna adından (ya da listesinden) sonra argüman değerini alacak bir
değişken belirtilebilir:
>>> try:
... spam()
... except NameError, x:
... print 'name', x, 'undefined'
...
name spam undefined
Bir istisnanın argümanı var ise ele alınmayan istisna mesajının son
kısmında (`ayrıntı') basılır.
İstisna işleyiciler (exception handlers) sadece try
bloğu içinde meydana gelen istisnaları değil try
bloğundan çağırılan (dolaylı olarak bile olsa) işlevlerdeki istisnaları
da ele alırlar. Örnek:
>>> def this_fails():
... x = 1/0
...
>>> try:
... this_fails()
... except ZeroDivisionError, detail:
... print 'Handling run-time error:', detail
...
Handling run-time error: integer division or modulo