Python - İstisnaların Ele Alınması
Programlama0 Mesaj
●33 Görüntüleme
- ReadBull.net
- Programlama ve Yazılım
- Programlama
- Python - İstisnaların Ele Alınması
-
26-09-2019, 10:11:03Belirli istisnaları ele alan programlar yazmak mumkundur. Aşağıdaki ornek, kullanıcıdan gecerli 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 cı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("Lutfen bir rakam giriniz: ")) ... break ... except ValueError: ... print "Bu gecerli bir giriş değil. Tekrar deneyin..." ... try deyimi aşağıdaki gibi calışır: Once try bloğu (try ve except arasındaki ifade(ler)) işletilir. Hicbir istisna oluşmaz ise except bloğu atlanır ve try deyimin icrası son bulur. Eğer try bloğu icinde bir istisna oluşur ise bloğun geri kalanı atlanır. İstisnanın turu except anahtar kelimesinden sonra kullanılan ile aynı ise try bloğunun kalan kısmı atlanır ve except bloğu yurutulur. Programın akışı try ... except kısmından sonra gelen ilk satırdan devam eder. Adı except bloğunda gecmeyen bir istisna oluşur ise ust seviyedeki try ifadelerine gecirilir; ancak bunu ele alan bir şey bulunmaz ise bu bir ele alınmamış istisna olur ve yurutme işlemi yukarıda da gorulduğu gibi bir hata mesajı ile son bulur. Bir try deyimi farklı istisnaları yakalayabilmek icin birden fazla except bloğuna sahip olabilir. Bir except bloğu parantez icine alınmış bir liste ile birden fazla istisna adı belirtebilir. Ornek: ... except (RuntimeError, TypeError, NameError): ... pass Son except bloğu istisna adı belirtilmeden de kullanılıp herhangi bir istisnayı yakalayabilir. Bunu cok dikkatli kullanın, cunku cok ciddi bir programlama hatasını bu şekilde gozden kacırabilirsiniz! Bu ozellik bir hata mesajı bastırıp ve tekrar bir istisna oluşturarak cağıranın istisnayı ele almasını da sağlamak icin 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 secimlik 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. Ornek: 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 cunku bu try ... except ifadesi tarafından korunan kodun oluşturmadığı bir istisnanın kazara yakalanmasını engeller. Bir istisna meydana geldiğinde istisna argumanı olarak bilinen bir değer de bulunabilir. Argumanın varlığı ve turu istisnanın turune bağlıdır. Argumanı olan istisna turleri icin except bloğunda istisna adından (ya da listesinden) sonra arguman değerini alacak bir değişken belirtilebilir: >>> try: ... spam() ... except NameError, x: ... print 'name', x, 'undefined' ... name spam undefined Bir istisnanın argumanı 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 icinde meydana gelen istisnaları değil try bloğundan cağırılan (dolaylı olarak bile olsa) işlevlerdeki istisnaları da ele alırlar. Ornek: >>> 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 __________________