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