İstisnaların Ele Alınması
Önceki Hatalar ve İstisnalar Sonraki
İstisnaların Ele Alınması
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
Önceki Üst Ana Başlık Sonraki
İstisnalar Başlangıç İstisna Oluşturma
Bir Linux Kitaplığı Sayfası