Python 3 - İ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. İşte Python - Standart İstisnalar'da bulunan standart İstisnaların bir listesi .

  • Assertions- Bu , Python 3 eğitimindeki İddialar bölümünde ele alınacaktır .

Standart İstisnalar

Python'da bulunan Standart İstisnaların bir listesi aşağıda verilmiştir. -

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

ZeroDivisonError

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

OSError

İş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.

İddia 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.

Assert için sözdizimi -

assert Expression[, Arguments]

İddia başarısız olursa, Python, AssertionError için argüman olarak ArgumentExpression kullanır. AssertionError istisnaları, try-exclu deyimi kullanılarak, diğer istisnalar gibi yakalanabilir ve işlenebilir. Eğer ele alınmazlarsa, programı sonlandıracaklar ve bir geri dönüş üretecekler.

Misal

Burada, belirli bir sıcaklığı Kelvin derecesinden Fahrenheit derecesine dönüştüren bir fonksiyon var. 0 ° K olabildiğince soğuk olduğu için, fonksiyon negatif bir sıcaklık görürse kurtarır -

#!/usr/bin/python3

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/python3

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 iznine sahip olmadığınız bir dosyayı açmaya çalışır, bu nedenle bir istisna oluşturur -

#!/usr/bin/python3

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

İstisnasız Hariç Madde

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.

Birden Fazla İstisnalı Hariç Madde

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. finally:blok, try bloğu bir istisna oluştursa da oluşturmasa da, yürütülmesi gereken herhangi bir kodu koyabileceğiniz bir 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.
   ......................

Note- Hariç cümle (ler) veya bir nihayet cümlesi sağlayabilirsiniz, ancak ikisini birden sağlayamazsınız. Else cümlesini bir last cümlesiyle birlikte kullanamazsınız .

Misal

#!/usr/bin/python3

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")
   fh.close()

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/python3

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")

Bu, aşağıdaki sonucu verir -

Going to close the file

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 as 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/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as 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'

Bir İstisna Oluşturma

Yükseltme ifadesini kullanarak istisnaları çeşitli şekillerde artırabilirsiniz. İçin genel sözdizimiraise ifade 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 Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note- Bir istisnayı yakalamak için, bir "istisna" cümlesi, bir sınıf nesnesi veya basit bir dize olarak atılan aynı istisnaya başvurmalıdır. Örneğin, yukarıdaki istisnayı yakalamak için, dış tümceyi şu şekilde yazmalıyız -

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

Aşağıdaki örnek, bir istisna oluşturmanın kullanımını göstermektedir -

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

Bu aşağıdaki sonucu verecektir

error in level argument -10

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ıdaki sınıfı tanımladıktan sonra, istisnayı şu şekilde ortaya çıkarabilirsiniz -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args