Python - İstisnaları İşleme
Python, Python programlarınızdaki herhangi bir beklenmedik hatayı gidermek ve bunlara hata ayıklama yetenekleri eklemek için çok önemli iki özellik sağlar -
Exception Handling- Bu, bu eğitimde ele alınacaktır. Python'da bulunan standart İstisnaların bir listesi: Standart İstisnalar .
Assertions- Bu , Python eğitimindeki İddialar bölümünde ele alınacaktır .
Standart İstisnalar Listesi -
Sr.No. | İstisna Adı ve Açıklaması |
---|---|
1 | Exception Tüm istisnalar için temel sınıf |
2 | StopIteration Bir yineleyicinin next () yöntemi herhangi bir nesneyi işaret etmediğinde yükseltilir. |
3 | SystemExit Sys.exit () işlevi tarafından oluşturulmuştur. |
4 | StandardError StopIteration ve SystemExit dışındaki tüm yerleşik istisnalar için temel sınıf. |
5 | ArithmeticError Sayısal hesaplamada meydana gelen tüm hatalar için temel sınıf. |
6 | OverflowError Bir hesaplama, sayısal bir tür için maksimum sınırı aştığında yükseltilir. |
7 | FloatingPointError Bir kayan nokta hesaplaması başarısız olduğunda yükseltilir. |
8 | ZeroDivisionError Tüm sayısal türler için sıfıra bölme veya modulo gerçekleştiğinde yükseltilir. |
9 | AssertionError Assert ifadesinin başarısız olması durumunda ortaya çıkar. |
10 | AttributeError Öznitelik referansının veya atamasının başarısız olması durumunda yükseltilir. |
11 | EOFError Raw_input () veya input () işlevinden herhangi bir girdi olmadığında ve dosyanın sonuna ulaşıldığında yükseltilir. |
12 | ImportError Bir ithalat ifadesi başarısız olduğunda oluşturulur. |
13 | KeyboardInterrupt Kullanıcı programın yürütülmesini genellikle Ctrl + c tuşlarına basarak durdurduğunda yükseltilir. |
14 | LookupError Tüm arama hataları için temel sınıf. |
15 | IndexError Bir dizide dizin bulunmadığında yükseltilir. |
16 | KeyError Sözlükte belirtilen anahtar bulunamadığında yükseltilir. |
17 | NameError Yerel veya genel ad alanında bir tanımlayıcı bulunamadığında oluşturulur. |
18 | UnboundLocalError Bir işlev veya yöntemdeki yerel bir değişkene erişmeye çalışırken yükseltilir, ancak ona herhangi bir değer atanmamıştır. |
19 | EnvironmentError Python ortamı dışında meydana gelen tüm istisnalar için temel sınıf. |
20 | IOError Var olmayan bir dosyayı açmaya çalışırken print deyimi veya open () işlevi gibi bir girdi / çıktı işlemi başarısız olduğunda yükseltilir. |
21 | IOError İşletim sistemiyle ilgili hatalar için oluşturulmuştur. |
22 | SyntaxError Python sözdiziminde bir hata olduğunda ortaya çıkar. |
23 | IndentationError Girinti doğru şekilde belirtilmediğinde yükseltilir. |
24 | SystemError Yorumlayıcı dahili bir sorun bulduğunda yükseltilir, ancak bu hatayla karşılaşıldığında Python yorumlayıcısı çıkmaz. |
25 | SystemExit Python yorumlayıcısından sys.exit () işlevi kullanılarak çıkıldığında oluşturulur. Kodda ele alınmazsa, yorumlayıcının çıkmasına neden olur. |
26 | TypeError Belirtilen veri türü için geçersiz olan bir işlem veya işlev denendiğinde oluşturulur. |
27 | ValueError Bir veri türünün yerleşik işlevi geçerli türde bağımsız değişkenlere sahipse, ancak bağımsız değişkenler belirtilen geçersiz değerlere sahip olduğunda oluşturulur. |
28 | RuntimeError Oluşturulan bir hata herhangi bir kategoriye girmediğinde ortaya çıkar. |
29 | NotImplementedError Miras alınan bir sınıfta uygulanması gereken soyut bir yöntem gerçekte uygulanmadığında ortaya çıkar. |
Python'da İddialar
İddia, programı test etmeyi bitirdiğinizde açabileceğiniz veya kapatabileceğiniz bir akıl sağlığı kontrolüdür.
Bir iddiayı düşünmenin en kolay yolu, onu bir iddiaya benzetmektir. raise-ifbeyan (veya daha doğru olmak gerekirse, eğer değilse yükseltme ifadesi). Bir ifade test edilir ve sonuç yanlış çıkarsa bir istisna ortaya çıkar.
İddialar, 1.5 sürümünde tanıtılan Python'un en yeni anahtar sözcüğü olan assert ifadesi tarafından gerçekleştirilir.
Programcılar genellikle geçerli girdiyi kontrol etmek için bir işlevin başlangıcına ve geçerli çıktıyı kontrol etmek için bir işlev çağrısından sonra onaylar koyarlar.
assert Bildirimi
Python, bir assert ifadesiyle karşılaştığında, beraberindeki ifadeyi değerlendirir ki bu da doğrudur. İfade yanlışsa, Python bir AssertionError istisnası oluşturur.
syntax iddia için -
assert Expression[, Arguments]
İddia başarısız olursa, Python, AssertionError için argüman olarak ArgumentExpression kullanır. AssertionError istisnaları, try-exclude deyimi kullanılarak diğer herhangi bir istisna gibi yakalanabilir ve işlenebilir, ancak işlenmezse, programı sonlandıracak ve bir izleme geri üretecektir.
Misal
Burada bir sıcaklığı Kelvin derecesinden Fahrenheit derecesine çeviren bir fonksiyon var. Sıfır derece Kelvin olabileceği kadar soğuk olduğundan, fonksiyon negatif bir sıcaklık görürse kurtarır -
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
İstisna nedir?
Bir istisna, programın komutlarının normal akışını bozan bir programın yürütülmesi sırasında meydana gelen bir olaydır. Genel olarak, bir Python betiği baş edemeyeceği bir durumla karşılaştığında, bir istisna yaratır. Bir istisna, bir hatayı temsil eden bir Python nesnesidir.
Bir Python betiği bir istisna oluşturduğunda, istisnayı hemen ele almalıdır, aksi takdirde sonlanır ve çıkar.
Bir istisnayı ele almak
Bazı varsa şüpheli bir duruma neden olabilir kodu, sen a şüpheli kod yerleştirerek programı savunabilirtry:blok. Try: blocktan sonra birexcept: deyim, ardından sorunu olabildiğince zarif bir şekilde ele alan bir kod bloğu gelir.
Sözdizimi
İşte basit bir try sözdizimi .... dışında ... else blokları -
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Yukarıda bahsedilen söz dizimiyle ilgili birkaç önemli nokta:
Tek bir try ifadesinde birden çok istisna ifadesi bulunabilir. Bu, try bloğu farklı tipte istisnalar atabilecek ifadeler içerdiğinde kullanışlıdır.
Ayrıca, herhangi bir istisnayı işleyen genel bir istisna cümlesi de sağlayabilirsiniz.
Hariç tümceciklerinden sonra, başka bir yan tümce ekleyebilirsiniz. Try: bloğundaki kod bir istisna oluşturmazsa, else-bloğundaki kod yürütülür.
Else-blok, try: bloğunun korumasına ihtiyaç duymayan kodlar için iyi bir yerdir.
Misal
Bu örnek bir dosyayı açar, içeriği, dosyasına yazar ve zarif bir şekilde çıkar çünkü hiçbir sorun yoktur -
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
Bu, aşağıdaki sonucu verir -
Written content in the file successfully
Misal
Bu örnek, yazma izniniz olmayan bir dosyayı açmaya çalışır, bu nedenle bir istisna oluşturur -
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
Bu, aşağıdaki sonucu verir -
Error: can't find file or read data
Dışında Özel Durum Clause
Ayrıca, aşağıdaki gibi tanımlanmış istisnalar olmadan da kullanabilirsiniz -
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Bu tür bir try-exceptifadesi meydana gelen tüm istisnaları yakalar. Bu türden bir try-exclude deyimini kullanmak iyi bir programlama uygulaması olarak kabul edilmez, çünkü tüm istisnaları yakalar ancak programcının oluşabilecek sorunun temel nedenini belirlemesini sağlamaz.
Hariç Çoklu İstisnalar ile Clause
Birden fazla istisnayı ele almak için aynı exclu ifadesini aşağıdaki gibi de kullanabilirsiniz :
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
Deneme Sonunda Madde
Kullanabilirsin finally: ile birlikte blok try:blok. Nihayet bloğu, try bloğu bir istisna ortaya çıkarsa da çıkmasa da yürütülmesi gereken herhangi bir kodun yerleştirileceği yerdir. Try-nihayet ifadesinin sözdizimi şudur -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Else cümlesini bir last cümlesiyle birlikte kullanamazsınız .
Misal
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
Dosyayı yazma modunda açma izniniz yoksa, bu aşağıdaki sonucu verecektir -
Error: can't find file or read data
Aynı örnek aşağıdaki gibi daha net yazılabilir -
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
Bir özel atılmış edildiğinde deneyin bloğu, uygulama anında geçer en sonunda blok. Tüm ifadeler sonra nihayet bloğu yürütülür, istisna tekrar yükseltilir ve işlenme şeklinden hariç ifadeleri ise bir sonraki daha yüksek tabakada mevcut deneyin-hariç açıklamada.
Bir İstisna Argümanı
Bir istisna , problem hakkında ek bilgi veren bir değer olan bir argümana sahip olabilir . Argümanın içeriği istisnaya göre değişir. Hariç tümcesinde aşağıdaki gibi bir değişken sağlayarak bir istisnanın argümanını yakalarsınız -
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
Kodu tek bir istisnayı işleyecek şekilde yazarsanız, bir değişkenin istisna deyimindeki istisnanın adını takip etmesini sağlayabilirsiniz. Birden fazla istisnayı yakalıyorsanız, istisnanın başlığını takip eden bir değişkeniniz olabilir.
Bu değişken, çoğunlukla istisnanın nedenini içeren istisnanın değerini alır. Değişken, tek bir değeri veya bir demet biçiminde birden çok değeri alabilir. Bu demet genellikle hata dizesini, hata numarasını ve bir hata konumunu içerir.
Misal
Aşağıda tek bir istisna örneği verilmiştir -
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
Bu, aşağıdaki sonucu verir -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
İstisnaların Oluşturulması
Yükseltme ifadesini kullanarak istisnaları çeşitli şekillerde artırabilirsiniz. İçin genel sözdizimiraise ifadesi aşağıdaki gibidir.
Sözdizimi
raise [Exception [, args [, traceback]]]
Burada Exception , istisna türüdür (örneğin, NameError) ve argüman , istisna argümanı için bir değerdir. Argüman isteğe bağlıdır; sağlanmadıysa, istisna bağımsız değişkeni Yok şeklindedir.
Son argüman olan traceback de isteğe bağlıdır (ve pratikte nadiren kullanılır) ve mevcutsa istisna için kullanılan izleme nesnesidir.
Misal
Bir istisna bir dizge, sınıf veya nesne olabilir. Python çekirdeğinin ortaya çıkardığı istisnaların çoğu, sınıfın bir örneği olan bir argümanla birlikte sınıflardır. Yeni istisnaları tanımlamak oldukça kolaydır ve şu şekilde yapılabilir -
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
Note:Bir istisnayı yakalamak için, bir "exclude" cümlesi, sınıf nesnesine veya basit dizeye atılan aynı istisnaya başvurmalıdır. Örneğin, yukarıdaki istisnayı yakalamak için, hariç tümceyi aşağıdaki gibi yazmalıyız -
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
Kullanıcı Tanımlı İstisnalar
Python ayrıca, standart yerleşik istisnalardan sınıfları türeterek kendi istisnalarınızı oluşturmanıza da olanak tanır.
İşte RuntimeError ile ilgili bir örnek . Burada, RuntimeError'dan alt sınıflara ayrılmış bir sınıf oluşturulur . Bu, bir istisna yakalandığında daha spesifik bilgiler görüntülemeniz gerektiğinde kullanışlıdır.
Try bloğunda, kullanıcı tanımlı istisna ortaya çıkar ve dış bloğa yakalanır. E değişkeni, Networkerror sınıfının bir örneğini oluşturmak için kullanılır .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Dolayısıyla, yukarıda sınıfı tanımladıktan sonra, istisnayı aşağıdaki gibi ortaya çıkarabilirsiniz -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args