Python Hata Tipleri

Hüseyin

Hüseyin

Üye
Top Poster Of Month
Katılım
21 Ocak 2024
Mesajlar
78
Tepkime puanı
27
Puanları
18
Python'da harika bir proje üzerinde çalıştığınızı bazı kodlar yazdığınızı hayal edin. Ancak kodu çalıştırmaya çalıştığınızda, yorumlayıcı “ Oops, there's an error!” diyor. Size kodunuzda anlamadığı bir şey olduğunu söylüyor.

Panik yapmayın; Python'da kod yazmayı öğrenirken hata yapmak ve hata almak tamamen normaldir. Bu bir bulmaca çözmeye benzer - hangi parçaların uyuşmadığını bulup yeniden deneyerek öğrenirsiniz.

Bu makale size kodunuzu çalıştırırken karşılaşabileceğiniz bazı yaygın Python hatalarını ve bunlarla nasıl başa çıkacağınızı öğretecek.

Python'da Hata Türleri ve İstisnalar

Python'da hata, kodunuzdaki bir şeyin Python dilinin kurallarına uymadığına dair bilgisayarınızdan gelen bir sinyal gibidir. Bilgisayarın “Hey, bu kısmı anlamıyorum!” demesinin bir yoludur.

Şimdi, hatalar ve istisnalar bazen birbirinin yerine kullanılır; ancak, her iki terim arasında küçük bir fark vardır.

Hatalar programınızın çalışmasını engelleyen barikatlar gibidir, istisnalar ise programın normal akışını değiştiren ve beklenmedik sonuçlar veren dolambaçlı yollar gibidir.

Aşağıda Python'daki bazı yaygın hataları ve istisnaları, bunları tanımanıza ve anlamanıza yardımcı olacak kod örnekleriyle birlikte bulabilirsiniz:

SyntaxError

Bu hata, kod Python'un sözdizimi kurallarını ihlal ettiğinde ortaya çıkar. İngilizce dilinde yazım veya dilbilgisi hataları yapmak gibidir. SyntaxError'ın bazı yaygın nedenleri arasında bir anahtar kelimenin veya tanımlayıcının yanlış yazılması, eksik tırnak işaretleri, açık parantez ve uyumsuz veya eksik noktalama işaretleri bulunur.

İşte Python'da SyntaxError'a yol açabilecek bir kod örneği:

Python:
#uyumsuz veya eksik noktalama işaretleri
if x = 5:
    print('x eşittir 5')

Karşılaştırma operatörü yerine atama operatörü kullandığımız için bu kod bir SyntaxError ile sonuçlandı.

NameError

Python'da NameError, henüz tanımlanmamış veya kapsam dışı olan bir değişken, fonksiyon veya modül adını kullanmaya veya erişmeye çalıştığınızda ortaya çıkar.

İşte bir NameError'a yol açabilecek bir örnek:

Python:
#Tanımlanmamış bir değişkeni kullanma
print(x)

'x' tanımlanmadığından, bu kod bir NameError oluşturacaktır.

IndentationError

Bir kod satırının başındaki boşluklar beklenen kalıpları takip etmediğinde bir IndentationError oluşur.

İşte bu hatayı göstermek için bir örnek:

Python:
if 5 > 2:
print(“Beş ikiden büyüktür!”)

Bu örnekte, “if” ifadesinden sonra uygun bir girinti yoktur, bu da bir IndentationError ile sonuçlanır.

TypeError

TypeError
, uygun olmayan türdeki bir nesne üzerinde bir işlem gerçekleştirildiğinde veya bir işlev uygulandığında ortaya çıkar. Aşağıda gösterildiği gibi bir dize ve bir tamsayı eklemeye çalıştığınızda buna bir örnek verilebilir:

Python:
num = 5
text = "Hello"
result = num + text

Bu örnekte, toplama işlemi bir tamsayı ve bir dize üzerinde gerçekleştirilir ve bu da bir TypeError ile sonuçlanır.

TypeError, çağrılamayan bir nesneyi çağırmaya çalışmak gibi, denenen belirli işlemi desteklemeyen nesneler üzerinde işlem gerçekleştirmeye çalıştığınızda da ortaya çıkabilir. İşte bunu açıklayan bir örnek:

Python:
numbers = [1,2,3]
result = numbers(0)

Yukarıdaki örnekte, 'numbers' nesnesi çağrılabilir değildir. Dolayısıyla, 'numbers' nesnesini indekslenebilir bir liste yerine bir fonksiyon olarak kullanma girişimi bir tür hatasına neden olur.

ValueError

Python'da, yerleşik bir işlem veya işlev doğru türe sahip ancak uygun olmayan bir değere sahip bir bağımsız değişken aldığında bir ValueError ortaya çıkar.

Bir dizeyi tamsayıya dönüştürmeye çalıştığınızda, bir listede bulunmayan bir dizine eriştiğinizde veya belirli bir işlev veya işlem için uygun olmayan değerlerle işlem gerçekleştirdiğinizde olduğu gibi çeşitli senaryolarda bir ValueError alabilirsiniz.

İşte bunu göstermek için bir örnek:

Python:
number = int("abc")

Bu örnekte, 'int()' işlevi tam sayıya dönüştürülemeyen bir dizeyle çağrılır ve bir ValueError ile sonuçlanır.

KeyError

Python'da KeyError, bir program sözlükte var olmayan bir anahtara erişmeye çalıştığında ortaya çıkar. Yani, sözlükte bulunmayan bir anahtarı kullanarak bir değer almaya çalışırsanız, bir KeyError alırsınız. İşte bunu göstermek için bir örnek:

Python:
#Bir sözlük oluşturma
information = {'name': 'PwnLabMe', 'age': 3, 'city': 'Ankara'}

#Accessing a key that doesn't exist
value = information['gender']

Bu örnekte, 'information' sözlüğündeki 'gender' anahtarına erişmeye çalışmak bir KeyError ile sonuçlanacaktır çünkü 'gender' sözlükte geçerli bir anahtar değildir.

IndexError

Bu, geçersiz bir dizin kullanarak bir listedeki, tuple'daki veya başka bir dizideki bir öğeye erişmeye çalıştığınızda ortaya çıkan başka bir yaygın hatadır. Genellikle, sağladığınız dizin aşağıda gösterildiği gibi söz konusu dizi için geçerli aralığın dışında olduğunda bu hatayı alırsınız:

Python:
numbers = [1, 2, 3, 4, 5]
print(numbers[5])

# 'numbers' için geçerli indisler 0, 1, 2, 3 ve 4 olduğundan bu bir IndexError oluşturacaktır.

Bu kod, aralık dışında olan 'numbers' listesinde 5. dizindeki öğeye erişmeye çalışır. Bu yüzden kod bir IndexError döndürüyor. Python'da indekslemenin 0'dan başladığını unutmayın.

ZeroDivisionError

Matematikte sıfıra bölmek tanımsızdır çünkü sıfır kişi arasında paylaştıramayız. Python da Matematik ile aynı fikirdedir, bu yüzden bir sayıyı sıfıra bölmeye çalıştığınızda ZeroDivisionError hatası verir.

İşte ZeroDivisionError oluşturacak bir Python kodu örneği:

Python:
numerator = 15
denominator = 0
result = numerator / denominator

Bu örnekte, payda sıfır olduğu için bölme işlemi ZeroDivisionError hatasına yol açacaktır.

FloatingPointError

Floating point sayılar veya float sayılar, ondalık noktalı gerçek sayıları temsil etmek için kullanılır. Örneğin, 0,6, -3,345 ve 2,5 kayan noktalı sayılardır. Bu sayılar bilgisayar donanımında taban 2 (ikili) kesirler olarak temsil edilir.

Şimdi, mesele şu: bilgisayarlar tam sayılarla çalışmakta iyidir, ancak çok sayıda ondalık basamağı olan sayılarla uğraşmak söz konusu olduğunda, bazen sınırlamalarla karşılaşabilirler.

On iki keki aynı anda ağzınıza sığdırmaya çalıştığınızı düşünün - sığdırmak için teker teker yemeniz gerekebilir. Bilgisayarlardaki kayan noktalı sayılarda da olan şey budur.

Bu nedenle, bilgisayarlar kayan noktalı sayılarla çalıştığında, hesaplamalarda küçük hatalar olabilir ve bu da bazen beklenmedik sonuçlar verebilir. Bu da bizi FloatingPointError'a götürür.

Python'daki bir FloatingPointError, Floating point sayılarla çalışırken, bilgisayar donanımının bu sayıları sonlu hassasiyetle temsil etmedeki sınırlamaları nedeniyle oluşabilecek yanlışlıkları ifade eder. Bu, hesaplamalarda beklenmedik veya yanlış sonuçlara yol açabilir. İşte bu hatayı göstermek için bir kod örneği:
Python:
x = 1.1
y = 2.2
z = 3.3

if x + y == z:
    print("x + y equals z")
else:
    print("x + y does not equal z")

Bu kodu çalıştırdığınızda, matematiksel olarak 1.1 + 2.2 eşittir 3.3 olmasına rağmen “x + y eşit değildir z” yazdırır. Bu beklenmedik sonuç, bilgisayarlardaki kayan nokta gösteriminin sınırlamaları nedeniyle ortaya çıkar.

Bilgisayarların ZeroDivisionError ve NameError gibi diğer hatalarda olduğu gibi kayan nokta hataları hakkında sizi açıkça bilgilendirmediğini unutmayın. Bunun yerine, bu hatalar beklenmedik veya yanlış sonuçlarla kendini gösterebilir. Bu nedenle kayan nokta hatalarının ele alınması, döndürülen sonuçların ve beklenen değerlerin dikkatli bir şekilde karşılaştırılmasını gerektirir.
UnboundLocalError

Bir yerel değişken, bir işlev yürütülmeye başlandığında oluşturulur ve yalnızca söz konusu işlev içinde erişilebilir. Ardından, işlev sona erdiğinde yerel değişken kaybolur ve kapsamı tanımlandığı işlevle sınırlıdır.

Şimdi, bu yerel değişkene bir fonksiyonun yerel kapsamı içinde bir değer atanmadan önce başvurulduğunda, UnboundLocalError ortaya çıkar. İşte bu hatayı göstermek için bir kod örneği:

Python:
def test():
       print(var) 
       var = 10
test()

Bu örnekte, 'var' değişkenine 'test' fonksiyonu içindeki atamasından önce referans verilmesi UnboundLocalError ile sonuçlanacaktır.

ImportError

Python'da import deyimi bir modülü içe aktaramadığında bir ImportError oluşur. Bu, modülün yüklü olmaması, mevcut ortamdan erişilebilir olmaması veya döngüsel içe aktarma (iki veya daha fazla modülün birbirine bağlı olması ve Python yorumlayıcısının kafasını karıştıran bir döngü oluşturması) gibi çeşitli nedenlerden dolayı olabilir. Örneğin:

Python:
from math import funny_function

'funny_function', 'math' modülü içinde mevcut değildir, bu nedenle içe aktarmaya çalıştığınızda bir ImportError ile karşılaşırsınız.
ModuleNotFoundError

Python'da bir ModuleNotFoundError ile karşılaştığınızda, import deyiminin belirtilen modülü bulamadığı anlamına gelir.

ModuleNotFoundError, ImportError'ın bir alt sınıfıdır. Bu, import deyiminde belirtilen modülün bulunamadığını özellikle belirttiği anlamına gelirken, ImportError import ile ilgili çeşitli sorunlar için ortaya çıkabilen daha genel bir istisnadır. ModuleNotFoundError istisnasını göstermek için bazı örnekler aşağıda verilmiştir:

Python:
import praise_module

Bu örnekte, 'praise_module' mevcut ortamda mevcut değildir, dolayısıyla ModuleNotFoundError.

Python:
import numpy

NumPy mevcut ortamda yüklü değilse ve onu içe aktarmaya çalışırsanız, bir ModuleNotFoundError oluşacaktır.
FileNotFoundError

Bu hata, var olmayan bir dosyayı açmaya çalıştığınızda ortaya çıkar. Aşağıdaki örneğe bir göz atın:


Python:
file = open('pj_file.txt', 'r')
content = file.read()

Bu örnekte, 'pj_file.txt' dosyası mevcut değildir, dolayısıyla hata oluşur.

PermissionError

Errno 13]
olarak da bilinen PermissionError, izin kısıtlamaları nedeniyle bir dosya veya dizine erişilemediğinde ortaya çıkar. Dolayısıyla, belirli bir dosyaya erişmek veya bu dosya üzerinde işlem yapmak için gerekli izne sahip değilseniz, bir PermissionError ortaya çıkacaktır.

OverflowError

Python'da bir OverflowError, bir aritmetik işlemin sonucu mevcut bellek veya veri türü içinde temsil edilemeyecek kadar büyük olduğunda meydana gelir. İşte OverflowError'a yol açacak bir örnek:

Python:
import math
print(math.exp(1000))

Bu örnekte kod, Python'un math modülündeki 'math.exp()' fonksiyonunu kullanarak 1000'in kuvvetine yükseltilmiş 'e' üstel fonksiyonunu hesaplamaya çalışmaktadır. Ancak, bu hesaplamanın sonucu Python'un aritmetiğinin işleyebileceği sayı aralığı içinde gösterilemeyecek kadar büyüktür. Bu nedenle, hesaplanan sonucun kullanılan veri türü için temsil edilebilir aralığın dışında kaldığını gösteren bir OverflowError, özellikle de bir “matematik aralığı hatası” ortaya çıkar.

Python'da İstisnalar Nasıl Ele Alınır?

Aşağıda Python'da hataları kodunuzun yürütülmesini durdurmadan önce yakalamanın bazı yolları verilmiştir.
Try-Except İfadeleri

try-except
deyimi, kodunuzu hatalara karşı test etmenin ve hatayı ele almanın en yaygın yoludur.

İşte nasıl çalıştığı:
Try Bloğu: Bir istisna oluşturabilecek kod 'try' bloğunun içine yerleştirilir.

Except Bloğu: 'try' bloğunda bir istisna oluşursa, kontrol hemen 'except' bloğuna geçer. 'except' bloğunun içindeki kod, istisnayı işlemek için yürütülür.

Örnek:

Python:
try:
    file = open('pj_file.txt', 'r')
    content = file.read()
    file.close()
except:
    print("Error: File Not Found")

Bu örnekte, 'try' bloğu var olmayan bir dosyayı açmaya çalışmakta ve bu da FileNotFoundError hatasına neden olmaktadır. 'except' deyimi istisnayı yakalar ve bir hata mesajıyla birlikte ele alır.

Yukarıdaki kodda yaptığım gibi çıplak bir 'except' deyimi kullanırsanız, hem beklenen hem de beklenmeyen istisnalar dahil olmak üzere 'try' bloğu içinde meydana gelen tüm istisnaları yakalayacağını unutmayın.

Bu, belirli hata türlerini tanımlamayı ve ele almayı zorlaştırabilir. Bu nedenle, istisnaları ele almak için bu ikinci yöntemi göz önünde bulundurmalısınız.
İstisnayı Belirleme

Yalın bir 'except' cümlesi kullanmak yerine mümkün olduğunda belirli istisnalardan bahsetmek her zaman iyi bir uygulamadır. Bu, daha hedefli hata işlemeye olanak tanır ve kod içindeki farklı istisnaları nasıl yöneteceğiniz konusunda daha fazla kontrol sağlar.

İşte nasıl çalıştığı:
Try Bloğu: Bir istisna oluşturabilecek kod 'try' bloğunun içine yerleştirilir.

Except Bloğu: 'try' bloğundan sonra, ele alınacak farklı istisna türlerini belirtmek için bir veya daha fazla 'except' bloğu kullanılabilir. Her 'except' bloğu, aşağıda gösterildiği gibi belirli bir istisna türüyle ilişkilendirilir:

Python:
try:
    file = open('pj_file.txt', 'r')
content = file.read()
file.close()

except FileNotFoundError:
print("Error: File not found")
except PermissionError:
print("Error: Permission denied")

Bu örnekte, ilk 'except' bloğu FileNotFoundError istisnasını ele alır. İkinci 'except' bloğu PermissionError istisnasını ele alır.

Kodu çalıştırdığınızda, yalnızca ilk hata mesajını döndürdüğüne dikkat edin. Bunun nedeni, Python'da bir 'except' bloğu tarafından bir hata yakalandığında, programın hemen ilgili bloğa atlaması ve içindeki kodu çalıştırmasıdır. Bu, ilk 'except' bloğu tetiklenirse, programın ikinci 'except' bloğuna geçmeyeceği anlamına gelir.
'finally' Anahtar Sözcüğünü Kullanma

'finally' anahtar sözcüğü, kod güvenilirliğini korumak ve dosyaları kapatmak veya kaynakları serbest bırakmak gibi temizleme görevlerini yerine getirmek için çok yararlıdır.

Python'da 'finally' bloğu, 'try-except' deyimiyle birlikte, bir istisnanın ortaya çıkıp çıkmadığına bakılmaksızın her zaman yürütülecek bir kod bölümü tanımlamak için kullanılır. Bu örneğe bir göz atın:

Python:
file = None #Intialize the file variable
try:
file = open('pj_file.txt', 'r')
content = file.read()
file.close()

except FileNotFoundError:
print("Error: File not found")
except PermissionError:
print("Error: Permission denied")

finally:
if file is not None:
file.close() # Bu, dosyanın kapatıldığından emin olmak için her zaman yürütülecektir

Bu örnekte, 'finally' bloğu, içeriği okunurken bir istisna meydana gelse bile dosyanın kapatılmasını sağlar.

Sonuç

Odak noktanız neyin yanlış gittiğini ve bunu nasıl düzelteceğinizi veya ele alacağınızı anlamak olmalıdır.
 
Geri
Üst