Python'da İstisna (Exception) ve Hata (Error) Yönetimi
Hatalar ve istisnalar programın çökmesine veya beklenmedik davranışlara yol açabilir; Python, kodun kararlılığını artırmak için sağlam bir araç setiyle birlikte gelir.
Hatalar ve istisnalar beklenmedik davranışlara yol açabilir veya bir programın çalışmasını tamamen durdurabilir. Python, bu sorunları ele almak ve kodun sağlamlığını artırmak için çeşitli işlevler ve mekanizmalar sunar. Bu eğitimde, örneklerle birlikte farklı hata türlerini ve yerleşik işlevleri öğreneceğiz.
Hata (error), genellikle çalışma zamanında toparlanılamayan, hatalı sözdizimi veya yanlış girinti gibi kritik bir problemdir.
İstisna (exception) ise, normal program akışını bozan ancak yakalanıp yönetilebilen bir çalışma zamanı olayıdır; böylece program devam edebilir.
İstisnalar çalışma zamanında ortaya çıkarken, SyntaxError ve IndentationError gibi bazı hatalar, program çalışmadan önce ayrıştırıcı tarafından yakalanır.
Basitçe söylemek gerekirse, hata normal bir uygulamanın yakalamaması gereken kritik bir sorundur; istisna ise bir programın yakalaması gereken bir durumdur.
Farklı örneklere bakarak hatalar ve istisnalar hakkında daha fazla bilgi edinelim. Bunları kolayca çalıştırmak için, Python'un önceden kurulu olduğu ve tüm kod örneklerini içeren ücretsiz bir DataLab çalışma defteri oluşturabilirsiniz.
Python'da Hatalar
İşte, fonksiyon dışında bir return ifadesinin anlamsız olduğu bir sözdizimi hatası örneği. Programda hataları ele almamalıyız. Bunun yerine, string döndüren bir fonksiyon oluşturmalıyız.
Input In [1]return"DataCamp"^
SyntaxError:'return' outside function
Altyapı:
Fonksiyonu oluşturduk ancak girintileme hatalı. Girintileme hatalarını çalışma zamanında ele almamalıyız. Bunu elle düzeltebilir veya kod biçimlendirme araçları kullanabiliriz.
ValueError: bir işlem veya işlev doğru türde fakat yanlış değerde argüman aldığında oluşur.
ZeroDivisionError: bir değeri veya değişkeni sıfıra böldüğünüzde fırlatılır.
SyntaxError: Python sözdizimi yanlış olduğunda ayrıştırıcı tarafından fırlatılır.
IndentationError: girintileme hatalı olduğunda oluşur.
SystemError: yorumlayıcı dahili bir hata tespit ettiğinde fırlatılır.
Python'daki hata ve istisnaların tam listesini dokümantasyonu okuyarak bulabilirsiniz.
Python istisnaları hakkında daha fazla bilgi edinmek için Python'da Nesne Yönelimli Programlama kursumuzu alın. Sınıflar oluşturmayı ve kodu yeniden kullanmak ile optimize etmek için kalıtım ve çok biçimliliği nasıl kullanacağınızı öğretecek.
try, except, else ve finally ile İstisna Yönetimi
Hatalar ve istisnaları öğrendikten sonra, bunları try, except, else ve finally bloklarını kullanarak ele almayı öğreneceğiz.
Peki, onları ele almakla ne demek istiyoruz? Normal koşullarda bu hatalar kod yürütmeyi durdurur ve hata mesajını gösterir. Kararlı sistemler oluşturmak için bu hataları öngörmeli ve alternatif çözümler veya uyarı mesajlarıyla gelmeliyiz.
Bu bölümde, her bloğun ne yaptığını ve sağlam kod yazmak için onları nasıl kullanabileceğimizi öğreneceğiz.
try ve except deyimi
Python'da istisnaları ele almanın en basit yolu try ve except bloklarını kullanmaktır.
try deyiminin altındaki kodu çalıştırın.
Bir istisna fırlatıldığında, except deyiminin altındaki kodu yürütün.
Hata veya istisnada durmak yerine, kodumuz alternatif çözümlere geçecek.
Basit örnek
İlk örnekte, tanımsız x değişkenini yazdırmayı deneyeceğiz. Normal koşullarda hata fırlatıp yürütmeyi durdurmalıdır; ancak try ve except bloğuyla akış davranışını değiştirebiliriz.
try deyiminin altındaki kod çalışacak.
x'in tanımlı olmadığını bildiğimiz için, except deyimi çalışacak ve uyarıyı yazdıracaktır.
try:print(x)except:print("An exception has occurred!")Altyapı:
İkinci örnekte, birden fazla türde istisnayı ele almak için birden çok except deyimi kullanacağız.
Bir ZeroDivisionError istisnası fırlatılırsa program "You cannot divide a value with zero." yazacaktır.
Diğer istisnalar ise “Something else went wrong.” yazacaktır.
Bu, kodun kırılmadan aynı anda birden fazla istisnayı ele alabilmesini sağlar.
Not: İstisna türü belirtmeden çıplak bir except: kullanmaktan kaçının — bu, her şeyi yakalar; KeyboardInterrupt ve SystemExit dahil; bu da programınızın kapanmasını imkansız hale getirebilir ve ilgisiz hataları gizleyebilir. Her zaman beklediğiniz belirli istisnayı yakalayın, örneğin except ZeroDivisionError:.
try:print(1/0)except ZeroDivisionError:print("You cannot divide a value with zero")except:print("Something else went wrong")Altyapı:
Aşağıdaki kodda bir CSV dosyası okuyoruz ve FileNotFoundError istisnası fırlatıldığında, kod hatayı ve data.csv dosyası hakkında ek bir mesaj yazdıracaktır.
Evet, yürütmeyi kesmeden varsayılan hata mesajlarını yazdırabiliriz.
try:withopen('data.csv')asfile:
read_data =file.read()except FileNotFoundError as fnf_error:print(fnf_error)print("Explanation: We cannot load the 'data.csv' file")Altyapı:
[Errno 2] No such fileor directory:'data.csv'
Explanation: We cannot load the 'data.csv'fileAltyapı:
else yan tümcesiyle try
try ve except'i öğrendik; şimdi de else deyimini öğreneceğiz.
try deyimi bir istisna fırlatmadığında, kod else bloğuna girer. Bu, betiğinizin bir bölümünün istisna üreteceğini beklediğinizde bir çare ya da geri dönüş seçeneğidir. Genellikle, belirli hataların gizlenmesini istemediğiniz kısa bir kurulum veya doğrulama bölümünde kullanılır.
Not: Try-except bloğunda, tüm except deyimlerinden sonra else'i kullanabilirsiniz.
Basit örnek
ZeroDivisionError örneğine else deyimini ekliyoruz. Görüldüğü gibi, istisna olmadığında else altındaki print işlevi çalışır ve sonucu gösterir.
try:
result =1/3except ZeroDivisionError as err:print(err)else:print(f"Your answer is {result}")Altyapı:
Basit bir fonksiyon oluşturup çeşitli senaryolarda test ederek daha fazlasını öğrenelim.
find_nth_value() fonksiyonu argüman olarak x (liste) ve n (indis numarası) alır. IndexError istisnasını ele almak için try, except ve else bloğu oluşturduk.
x =[5,8,9,13]deffind_nth_value(x,n):try:
result = x[n]except IndexError as err:print(err)else:print("Your answer is ", result)Altyapı:
x listesinde dört değer var ve bunları 6. ve 2. indis için test edeceğiz.
try-except bloğunda finally anahtar sözcüğü, istisna olsa da olmasa da her zaman yürütülür. finally bloğu, bir istisna fırlatılmış veya yakalanmış olsun olmasın, her zaman try, except ve else'den sonra çalışır. Kaynakları temizlemede ve nesneleri kapatmada, özellikle dosyaları kapatmada oldukça kullanışlıdır.
divide fonksiyonu, ZeroDivisionError istisnalarını ele almak ve istisna olmadığında sonucu göstermek için oluşturulmuştur. Sonuç ne olursa olsun, her zaman finally çalışacak ve yeşil renkte “Code by DataCamp” yazacaktır.
defdivide(x,y):try:
result = x/y
except ZeroDivisionError:print("Please change 'y' argument to non-zero value")except:print("Something went wrong")else:print(f"Your answer is {result}")finally:print("\033[92m Code by DataCamp\033[00m")Altyapı:
İlk testte 1'i 0'a bölüyoruz; bu da ZeroDivisionError istisnasını fırlatmalı ve mesajı yazdırmalıdır. Görüldüğü gibi hata mesajından sonra ek bir satırımız var.
Üç senaryonun hepsinde ortak bir şey var. Kod her zaman finally deyimi altındaki print işlevini çalıştırıyor.
Python'a yeniyseniz ve gerçek bir programcı gibi kod yazmak istiyorsanız, Python Programming yetenek yolumuzu deneyin. Verimli kod yazmayı, Python fonksiyonlarını, yazılım mühendisliğini, birim testlerini ve nesne yönelimli programlamayı öğreneceksiniz.
Python'da İç İçe (Nested) İstisna Yönetimi
Birden fazla istisnayı art arda ele alacak şekilde programı hazırladığımızda iç içe istisna yönetimine ihtiyaç duyarız. Örneğin, else deyimi altında başka bir try-except bloğu ekleyebiliriz. Yani ilk deyim bir istisna fırlatmazsa, kodun diğer yarısıyla ikinci deyimi kontrol edebilirsiniz.
divide fonksiyonunu değiştirme
Önceki örnekteki divide fonksiyonunu değiştirdik ve else deyimi altında iç içe bir try-except bloğu ekledik. Böylece, bir AttributeError yoksa else çalışacak ve yeni kodu ZeroDivisionError istisnasına karşı kontrol edecektir.
defdivide(x,y):try:
value =50
x.append(value)except AttributeError as atr_err:print(atr_err)else:try:
result =[i / y for i in x]print( result )except ZeroDivisionError:print("Please change 'y' argument to non-zero value")finally:print("\033[92m Code by DataCamp\033[00m")Altyapı:
İlk senaryoda, dört değerli bir x listesi ve payda olarak 3 veriyoruz. Betik listeye 50 ekleyecek, listedeki her bir değeri 3'e bölecek ve sonucu gösterecektir.
Please change 'y' argument to non-zero value
Code by DataCampAltyapı:
Dosya düzenleme örneği
Dosya yükleme, metin yazma ve dosyayı kapatma gibi daha pratik örneklere bakalım.
file_editor() fonksiyonu şunları yapacak:
open() işlevi için FileNotFoundError istisnasını kontrol eder.
Dıştaki istisna fırlatılmazsa, write() işlevi istisnasını kontrol eder.
Ne olursa olsun, dosyayı açtıktan sonra finally deyimini çalıştırarak dosyayı kapatır.
Dıştaki try deyimi istisna fırlatırsa, geçersiz dosya yolu ile hata mesajını döndürür.
deffile_editor(path,text):try:
data =open(path)try:
data.write(text)except:print("Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.")finally:
data.close()except:print(f"{path} file is not found!!")Altyapı:
İlk senaryoda dosya yolunu ve metni sağlıyoruz.
path ="data.txt"
text ="DataLab: Share your data analysis in a cloud-based environment--no installation required."
file_editor(path,text)Altyapı:
write() işlevi metni ekleyemediği için içteki istisna fırlatıldı.
Unable to write the data. Please add an append:'a'or write:'w' parameter to the open() function.Altyapı:
Bu sorunu çözmek için üçüncü satırı data = open(path) ifadesinden data = open(path, 'a') ifadesine değiştirmemiz gerekir. Bu, yeni metni dosyaya eklememize izin verecektir.
Fonksiyonu tekrar çalıştırdıktan sonra, metni dosyaya başarıyla ekledik.
İç içe istisna yönetimi önerilmez; çünkü istisna yönetimini daha karmaşık hale getirir. Geliştiriciler, basit sıralı istisna yönetimi oluşturmak için birden fazla try-except bloğu kullanır.
Not: try veya except deyimi altında da iç içe bir try-except bloğu ekleyebilirsiniz. Bu tamamen gereksinimlerinize bağlıdır.
Python'da İstisna Fırlatma (Raising Exceptions)
İstisnaları yakalamanın ötesinde, raise anahtar sözcüğünü kullanarak onları bilerek fırlatabilirsiniz. Bu, iş kurallarını dayatmak veya girdi doğrulaması yapmak için kullanışlıdır. Aşağı yönde daha zor ayıklanabilir bir hataya yol açmadan önce bir şeylerin yanlış olduğuna dair bir sinyal sağlar.
Bir istisna fırlatmak için, raise anahtar sözcüğünü, ardından bir istisna adı gelecek şekilde kullanmamız gerekir.
ValueError fırlatma örneği
if/else deyiminde raise anahtar sözcüğü ekleyerek basitçe istisna fırlatabiliriz.
Örnekte, değer 1.000'i aşarsa ValueError fırlatıyoruz. Değeri 2.000 olarak değiştirdik; bu da if deyimini TRUE yaparak özel mesajla ValueError fırlatmasına neden oldu. Özel hata mesajı, sorunu hızlıca anlamanıza yardımcı olur.
value =2_000if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Altyapı:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)---->4raise ValueError("Please add a value lower than 1,000")5else:6print("Congratulations! You are the winner!!")
ValueError: Please add a value lower than 1,000Altyapı:
İstisna fırlatma örneği
Koşul sağlanırsa herhangi bir yerleşik Python istisnasını da fırlatabiliriz. Bizim durumumuzda, hata mesajıyla genel bir Exception fırlattık.
if value >1_000:# raise the Exceptionraise Exception("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Altyapı:
---------------------------------------------------------------------------
Exception Traceback (most recent call last)---->3raise Exception("Please add a value lower than 1,000")4else:5print("Congratulations! You are the winner!!")
Exception: Please add a value lower than 1,000Altyapı:
Fırlatılan istisnayı ele alma örneği
Kendi özel istisnamızı oluşturabilir ve try-except bloğunu kullanarak istisnayı ele alabiliriz.
Örnekte, try deyimi altına bir value error örneği ekledik.
Peki nasıl çalışacak? İstisna fırlatıp programı sonlandırmak yerine, sağladığımız hata mesajını görüntüleyecek.
value =2_000try:if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")# if false then raise the value errorexcept ValueError as e:print(e)Altyapı:
Bu tür istisna yönetimi, Python tarafından kapsanmayan ve uygulamanıza özgü gereksinimlere dair hatalara hazırlanmanıza yardımcı olur.
Bağımsız istisnalar fırlatmanın ötesinde, raise ... from kullanarak istisnaları zincirleyebilirsiniz. Bu, orijinal istisnayı bağlam olarak korur ve bir hatanın başka bir hataya neden olduğu durumlarda iz sürümlerini çok daha anlaşılır hale getirir.
try:open("config.json")except FileNotFoundError as e:raise RuntimeError("App failed to start: config file missing")from eAltyapı:
FileNotFoundError:[Errno 2] No such fileor directory:'config.json'
The above exception was the direct cause of the following exception:
RuntimeError: App failed to start: config file missingAltyapı:
from e kısmı, yeni istisnanın __cause__ özniteliğini ayarlar; böylece iz sürümünü okuyan herkes tam olarak neyin tetiklediğini görebilir. Bu, istisnaların kodun birden fazla katmanından geçtiği daha büyük uygulamalarda özellikle kullanışlıdır.
İstisna Yönetimi için Python 3.10 - 3.13'te Neler Yeni?
Bu blog yazısı ilk yazıldığından beri 3.10 ve 3.11 gibi daha yeni Python sürümlerine önemli yenilikler eklendi:
Python 3.10, match deyiminde hata türlerini eşleştirerek istisnaları daha sade biçimde ele almak için kullanılabilen yapısal desen eşleştirmeyi tanıttı. Bu, birden fazla istisna türüyle daha okunaklı şekilde uğraşırken özellikle yararlıdır. Örnek:
try:
result =1/0except Exception as e:match e:case ZeroDivisionError():print("You cannot divide by zero.")case NameError():print("Variable not defined.")case_:print("An unexpected error occurred.")Altyapı:
2. İz sürümlerinde daha ince taneli hata konumları (Python 3.11)
Python 3.11'de iz sürümleri artık tam hata konumlarını göstererek istisnaların hata ayıklamasını kolaylaştırıyor.
Python 3.11 ile iz sürümleri, istisnaya neden olan alt ifadeyi tam olarak işaretler:
ZeroDivisionError: division by zero
(1+2)*(3/0)^Altyapı:
3. İstisna grupları ve except* (Python 3.11)
Python 3.11, except* kullanarak tek bir blokta birden çok istisnayı ele almak için istisna gruplarını tanıttı. Bu, eşzamanlı olmayan kodu yönetmek veya birden fazla istisnanın fırlatılabileceği senaryolar için kullanışlıdır. Örnek:
try:raise ExceptionGroup("Multiple errors",[ValueError("Bad value"), TypeError("Bad type")])except* ValueError as ve:print(f"Handling ValueError: {ve}")except* TypeError as te:print(f"Handling TypeError: {te}")Altyapı:
4. İstisnalar için add_note yöntemi (Python 3.11)
İstisnalar artık geliştiricilerin daha iyi hata ayıklama için istisnalara özel notlar eklemesine olanak tanıyan bir add_note() yöntemine sahip. Örnek:
try:raise ValueError("Invalid input")except ValueError as e:
e.add_note("This happened while processing user input.")
e.add_note("Consider validating input before processing.")raiseAltyapı:
ValueError: Invalid input
Notes:- This happened while processing user input.- Consider validating input before processing.Altyapı:
5. PEP 654: İç içe istisnaların daha iyi ele alınması
İstisna gruplarıyla, iç içe istisnaların hata ayıklaması ve ele alınması artık daha kolay; özellikle çoklu işlem veya eşzamanlı olmayan görevler gibi karmaşık iş akışlarında.
6. Geliştirilmiş hata mesajları (Python 3.12)
Python 3.12, hata mesajlarını daha spesifik ve eyleme dönük hale getirme yönündeki uzun soluklu çabayı sürdürdü. Örneğin, NameError mesajları artık kapsamda benzer isimli değişkenleri önerebiliyor; yaygın türlerdeki öznitelik hataları ise daha hedefli ipuçları veriyor:
AttributeError:'list'object has no attribute 'appendd'. Did you mean:'append'?Altyapı:
7. Renklendirilmiş iz sürümleri (Python 3.13)
Python 3.13, etkileşimli yorumlayıcıda varsayılan olarak renklendirilmiş iz sürümlerini tanıttı. Hata türleri, satır numaraları ve mesajlar artık farklı renklerle vurgulanıyor; özellikle birden çok zincirlenmiş istisnayı içeren uzun iz sürümlerinde neyin yanlış gittiğini taramak ve anlamak belirgin şekilde hızlandı.
Sonuç
Hem birim testleri hem de istisna yönetimi, kodunuzu üretime hazır ve hataya dayanıklı hale getiren Python programlamanın temel parçalarıdır. Bu eğitimde Python'da istisnalar ve hatalar ile bunların nasıl ele alınacağını öğrendik. Ayrıca, karmaşık iç içe try-except bloklarını ve gereksinimlere göre özel istisna blokları oluşturmayı da gördük.
Bu araçlar ve mekanizmalar gereklidir; ancak işin çoğu basit try ve except bloklarıyla yapılır. try, kodun fırlattığı istisnaları arar; except ise bu istisnaları ele alır.
Eğer bu kafa karıştırıcı geldiyse ve nereden başlayacağınızı bilmiyorsanız, kapsamları, lambda fonksiyonlarını ve hata yönetimini anlamak için Introduction to Functions in Python kursumuzu tamamlayın. Ayrıca, kariyer becerileri kazanmak ve profesyonel bir Python geliştiricisi olmak için Python Programmer kariyer yoluna da kaydolabilirsiniz.
Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.
FAQs
Python'da bir hata (error) ile istisna (exception) arasındaki fark nedir?⌄
Python'da hata, programın devam etmesini engelleyen daha ciddi bir sorundur; örneğin kod yapısının yanlış olduğunu gösteren bir sözdizimi hatası gibi. Öte yandan istisna, programın normal akışını kesintiye uğratan ancak try-except bloklarıyla program içinde ele alınabilen bir durumdur; böylece program çalışmayı sürdürebilir.
Tek bir try-except bloğunda birden çok istisna yakalanabilir mi?⌄
Evet, Python tek bir try-except bloğunda birden çok istisnayı, istisna türlerini bir demet olarak belirterek yakalamaya izin verir. Örneğin: except (TypeError, ValueError):. Bu, aynı blokta bir TypeError ya da bir ValueError durumunu ele alacaktır.
Python'da özel bir istisna nasıl oluşturulur?⌄
Özel bir istisna, yerleşik Exception sınıfından miras alan yeni bir sınıf tanımlanarak oluşturulabilir. Örneğin:
Bir try-except yapısında else bloğunun amacı nedir?⌄
else bloğu, try bloğu bir istisna fırlatmazsa yürütülür. Bu, try bloğu başarılı olduğunda yalnızca çalıştırılması gereken kod için yararlıdır; böylece kod temiz kalır ve hata yönetimi normal yürütme yolundan ayrılır.
İstisna yönetiminde finally bloğu neden önemlidir?⌄
finally bloğu, bir istisna fırlatılıp fırlatılmamasından bağımsız olarak her zaman yürütülür. Genellikle dosyaların kapatılması veya kaynakların serbest bırakılması gibi temizleme eylemleri için kullanılır; böylece bu eylemler her koşulda yerine getirilir.
Python'da istisnaları nasıl bastırabilirsiniz?⌄
İstisnaları, contextlib.suppress bağlam yöneticisini kullanarak bastırabilirsiniz. Bu, yok sayılması gereken istisna türlerini belirtmenize olanak tanır. Örneğin:
from contextlib import suppress
with suppress(FileNotFoundError):open('non_existent_file.txt')Altyapı:
Bir Python programında bir istisna yakalanmazsa ne olur?⌄
Bir istisna yakalanmazsa çağrı yığınında (call stack) yukarı doğru yayılır ve ele alınmadan kalırsa programı sonlandırır; konsola, istisnanın nerede meydana geldiğini gösteren bir iz sürümü (traceback) yazdırır.
Bir istisna yakalandıktan sonra tekrar fırlatılabilir mi?⌄
Evet, bir istisnayı raise ifadesini bir except bloğunda argümansız kullanarak yeniden fırlatabilirsiniz. Bu, bir istisnayı daha ileriye yayılmasına izin vermeden önce günlüğe kaydetmek veya başka eylemler yapmak istediğinizde kullanışlıdır.
Python'da tüm istisnaları ele almanın bir yolu var mı?⌄
Çıplak bir except: yan tümcesiyle tüm istisnaları yakalamak mümkün olsa da, beklenmedik istisnaları da yakalayabileceği ve hata ayıklamayı zorlaştırabileceği için genellikle önerilmez. Belirli istisnaları yakalamak veya except Exception: kullanmak daha iyidir; böylece SystemExit ve KeyboardInterrupt gibi sistemden çıkışa yol açan istisnaları yakalamaktan kaçınmış olursunuz.
Meydana gelme zamanları açısından, sözdizimi hataları ile çalışma zamanı istisnalarını nasıl ayırt edersiniz?⌄
Sözdizimi hataları derleme zamanında tespit edilir; yani Python yorumlayıcısı program çalışmaya başlamadan bu hataları yakalar. Çalışma zamanı istisnaları ise, yorumlayıcının sıfıra bölme veya var olmayan bir değişkene erişme gibi gerçekleştiremeyeceği bir işlemle karşılaştığında, program yürütülürken meydana gelir.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Hatalar ve istisnalar beklenmedik davranışlara yol açabilir veya bir programın çalışmasını tamamen durdurabilir. Python, bu sorunları ele almak ve kodun sağlamlığını artırmak için çeşitli işlevler ve mekanizmalar sunar. Bu eğitimde, örneklerle birlikte farklı hata türlerini ve yerleşik işlevleri öğreneceğiz.
İstisnalar çalışma zamanında ortaya çıkarken,
SyntaxErrorveIndentationErrorgibi bazı hatalar, program çalışmadan önce ayrıştırıcı tarafından yakalanır.Basitçe söylemek gerekirse, hata normal bir uygulamanın yakalamaması gereken kritik bir sorundur; istisna ise bir programın yakalaması gereken bir durumdur.
Farklı örneklere bakarak hatalar ve istisnalar hakkında daha fazla bilgi edinelim. Bunları kolayca çalıştırmak için, Python'un önceden kurulu olduğu ve tüm kod örneklerini içeren ücretsiz bir DataLab çalışma defteri oluşturabilirsiniz.
Python'da Hatalar
İşte, fonksiyon dışında bir return ifadesinin anlamsız olduğu bir sözdizimi hatası örneği. Programda hataları ele almamalıyız. Bunun yerine, string döndüren bir fonksiyon oluşturmalıyız.
Fonksiyonu oluşturduk ancak girintileme hatalı. Girintileme hatalarını çalışma zamanında ele almamalıyız. Bunu elle düzeltebilir veya kod biçimlendirme araçları kullanabiliriz.
Python'da İstisnalar
Bir
ZeroDivisionError(Exception) ile karşılaştık. Bunu çalışma zamanındatryveexceptbloklarını kullanarak ele alabiliriz.NameErroristisnaları, bir değişken bulunamadığında oldukça yaygındır. İstisnayı, değişkeni değiştirerek veya bir uyarı yazarak da ele alabiliriz.Yerleşik Python İstisnaları
Varsayılan Python istisnalarının açıklamalarıyla birlikte listesi şöyledir:
AssertionError: assert ifadesi başarısız olduğunda fırlatılır.EOFError:input()işlevi dosya sonu durumuyla karşılaştığında fırlatılır.AttributeError: öznitelik ataması veya başvurusu başarısız olduğunda fırlatılır.TabError: girintilemeler tutarsız sekme veya boşluklardan oluştuğunda fırlatılır.ImportError: modül içe aktarma başarısız olduğunda fırlatılır.IndexError: bir dizinin indeksi aralık dışında olduğunda oluşur.KeyboardInterrupt: kullanıcı kesme tuşlarına (Ctrl + C veya Delete) bastığında fırlatılır.RuntimeError: bir hata hiçbir kategoriye girmediğinde oluşur.NameError: bir değişken yerel veya global kapsamda bulunamadığında fırlatılır.MemoryError: programların belleği tükendiğinde fırlatılır.ValueError: bir işlem veya işlev doğru türde fakat yanlış değerde argüman aldığında oluşur.ZeroDivisionError: bir değeri veya değişkeni sıfıra böldüğünüzde fırlatılır.SyntaxError: Python sözdizimi yanlış olduğunda ayrıştırıcı tarafından fırlatılır.IndentationError: girintileme hatalı olduğunda oluşur.SystemError: yorumlayıcı dahili bir hata tespit ettiğinde fırlatılır.Python'daki hata ve istisnaların tam listesini dokümantasyonu okuyarak bulabilirsiniz.
Python istisnaları hakkında daha fazla bilgi edinmek için Python'da Nesne Yönelimli Programlama kursumuzu alın. Sınıflar oluşturmayı ve kodu yeniden kullanmak ile optimize etmek için kalıtım ve çok biçimliliği nasıl kullanacağınızı öğretecek.
try, except, else ve finally ile İstisna Yönetimi
Hatalar ve istisnaları öğrendikten sonra, bunları
try,except,elsevefinallybloklarını kullanarak ele almayı öğreneceğiz.Peki, onları ele almakla ne demek istiyoruz? Normal koşullarda bu hatalar kod yürütmeyi durdurur ve hata mesajını gösterir. Kararlı sistemler oluşturmak için bu hataları öngörmeli ve alternatif çözümler veya uyarı mesajlarıyla gelmeliyiz.
Bu bölümde, her bloğun ne yaptığını ve sağlam kod yazmak için onları nasıl kullanabileceğimizi öğreneceğiz.
try ve except deyimi
Python'da istisnaları ele almanın en basit yolu
tryveexceptbloklarını kullanmaktır.trydeyiminin altındaki kodu çalıştırın.Bir istisna fırlatıldığında,
exceptdeyiminin altındaki kodu yürütün.Hata veya istisnada durmak yerine, kodumuz alternatif çözümlere geçecek.
Basit örnek
İlk örnekte, tanımsız
xdeğişkenini yazdırmayı deneyeceğiz. Normal koşullarda hata fırlatıp yürütmeyi durdurmalıdır; ancaktryveexceptbloğuyla akış davranışını değiştirebiliriz.trydeyiminin altındaki kod çalışacak.x'in tanımlı olmadığını bildiğimiz için, except deyimi çalışacak ve uyarıyı yazdıracaktır.Birden fazla except deyimi örneği
İkinci örnekte, birden fazla türde istisnayı ele almak için birden çok
exceptdeyimi kullanacağız.ZeroDivisionErroristisnası fırlatılırsa program "You cannot divide a value with zero." yazacaktır.Bu, kodun kırılmadan aynı anda birden fazla istisnayı ele alabilmesini sağlar.
Not: İstisna türü belirtmeden çıplak bir
except:kullanmaktan kaçının — bu, her şeyi yakalar;KeyboardInterruptveSystemExitdahil; bu da programınızın kapanmasını imkansız hale getirebilir ve ilgisiz hataları gizleyebilir. Her zaman beklediğiniz belirli istisnayı yakalayın, örneğinexcept ZeroDivisionError:.Dosya yükleme örneği
Şimdi daha pratik bir örneğe bakalım.
Aşağıdaki kodda bir CSV dosyası okuyoruz ve
FileNotFoundErroristisnası fırlatıldığında, kod hatayı vedata.csvdosyası hakkında ek bir mesaj yazdıracaktır.Evet, yürütmeyi kesmeden varsayılan hata mesajlarını yazdırabiliriz.
else yan tümcesiyle try
tryveexcept'i öğrendik; şimdi deelsedeyimini öğreneceğiz.trydeyimi bir istisna fırlatmadığında, kodelsebloğuna girer. Bu, betiğinizin bir bölümünün istisna üreteceğini beklediğinizde bir çare ya da geri dönüş seçeneğidir. Genellikle, belirli hataların gizlenmesini istemediğiniz kısa bir kurulum veya doğrulama bölümünde kullanılır.Not: Try-except bloğunda, tüm
exceptdeyimlerinden sonraelse'i kullanabilirsiniz.Basit örnek
ZeroDivisionErrorörneğineelsedeyimini ekliyoruz. Görüldüğü gibi, istisna olmadığındaelsealtındaki print işlevi çalışır ve sonucu gösterir.else ile IndexError örneği
Basit bir fonksiyon oluşturup çeşitli senaryolarda test ederek daha fazlasını öğrenelim.
find_nth_value()fonksiyonu argüman olarakx(liste) ven(indis numarası) alır.IndexErroristisnasını ele almak içintry,exceptveelsebloğu oluşturduk.xlistesinde dört değer var ve bunları 6. ve 2. indis için test edeceğiz.IndexErroristisnası fırlatıldı ve varsayılan “list index out of range” hata mesajını gördük.elsealtındaki sonucu yazdırdı.Python'da finally anahtar sözcüğü
try-exceptbloğundafinallyanahtar sözcüğü, istisna olsa da olmasa da her zaman yürütülür.finallybloğu, bir istisna fırlatılmış veya yakalanmış olsun olmasın, her zamantry,exceptveelse'den sonra çalışır. Kaynakları temizlemede ve nesneleri kapatmada, özellikle dosyaları kapatmada oldukça kullanışlıdır.dividefonksiyonu,ZeroDivisionErroristisnalarını ele almak ve istisna olmadığında sonucu göstermek için oluşturulmuştur. Sonuç ne olursa olsun, her zamanfinallyçalışacak ve yeşil renkte “Code by DataCamp” yazacaktır.İlk testte 1'i 0'a bölüyoruz; bu da
ZeroDivisionErroristisnasını fırlatmalı ve mesajı yazdırmalıdır. Görüldüğü gibi hata mesajından sonra ek bir satırımız var.Geçerli girdi eklediğimizde,
elsevefinallyblokları çalıştırılarak sonuç görüntülenir.Tam sayı yerine ikinci argüman olarak bir string ekledik; bu da
ZeroDivisionError'dan farklı bir istisna ve farklı bir mesaj fırlattı.Üç senaryonun hepsinde ortak bir şey var. Kod her zaman
finallydeyimi altındaki print işlevini çalıştırıyor.Python'a yeniyseniz ve gerçek bir programcı gibi kod yazmak istiyorsanız, Python Programming yetenek yolumuzu deneyin. Verimli kod yazmayı, Python fonksiyonlarını, yazılım mühendisliğini, birim testlerini ve nesne yönelimli programlamayı öğreneceksiniz.
Python'da İç İçe (Nested) İstisna Yönetimi
Birden fazla istisnayı art arda ele alacak şekilde programı hazırladığımızda iç içe istisna yönetimine ihtiyaç duyarız. Örneğin,
elsedeyimi altında başka bir try-except bloğu ekleyebiliriz. Yani ilk deyim bir istisna fırlatmazsa, kodun diğer yarısıyla ikinci deyimi kontrol edebilirsiniz.divide fonksiyonunu değiştirme
Önceki örnekteki
dividefonksiyonunu değiştirdik veelsedeyimi altında iç içe bir try-except bloğu ekledik. Böylece, birAttributeErroryoksaelseçalışacak ve yeni koduZeroDivisionErroristisnasına karşı kontrol edecektir.İlk senaryoda, dört değerli bir
xlistesi ve payda olarak 3 veriyoruz. Betik listeye 50 ekleyecek, listedeki her bir değeri 3'e bölecek ve sonucu gösterecektir.Fonksiyon herhangi bir istisna fırlatmadan başarıyla yürütüldü.
Liste yerine ilk argümana bir tam sayı verdik ve bu da
AttributeErrorfırlattı.Son senaryoda, listeyi verdik ancak ikinci argüman 0 olduğundan
elsedeyimi altındaZeroDivisionErroristisnası fırlatıldı.Dosya düzenleme örneği
Dosya yükleme, metin yazma ve dosyayı kapatma gibi daha pratik örneklere bakalım.
file_editor()fonksiyonu şunları yapacak:open()işlevi içinFileNotFoundErroristisnasını kontrol eder.write()işlevi istisnasını kontrol eder.finallydeyimini çalıştırarak dosyayı kapatır.İlk senaryoda dosya yolunu ve metni sağlıyoruz.
Dıştaki istisna fırlatıldı.
Dosya bulunamadı istisnasını çözmek için Linux
echokomutunu kullanarakdata.txtdosyası oluşturmalıyız.Ardından
file_editor()fonksiyonunu tekrar çalıştırın.write()işlevi metni ekleyemediği için içteki istisna fırlatıldı.Bu sorunu çözmek için üçüncü satırı
data = open(path)ifadesindendata = open(path, 'a')ifadesine değiştirmemiz gerekir. Bu, yeni metni dosyaya eklememize izin verecektir.Fonksiyonu tekrar çalıştırdıktan sonra, metni dosyaya başarıyla ekledik.
İç içe istisna yönetimi önerilmez; çünkü istisna yönetimini daha karmaşık hale getirir. Geliştiriciler, basit sıralı istisna yönetimi oluşturmak için birden fazla
try-exceptbloğu kullanır.Not:
tryveyaexceptdeyimi altında da iç içe birtry-exceptbloğu ekleyebilirsiniz. Bu tamamen gereksinimlerinize bağlıdır.Python'da İstisna Fırlatma (Raising Exceptions)
İstisnaları yakalamanın ötesinde,
raiseanahtar sözcüğünü kullanarak onları bilerek fırlatabilirsiniz. Bu, iş kurallarını dayatmak veya girdi doğrulaması yapmak için kullanışlıdır. Aşağı yönde daha zor ayıklanabilir bir hataya yol açmadan önce bir şeylerin yanlış olduğuna dair bir sinyal sağlar.Bir istisna fırlatmak için,
raiseanahtar sözcüğünü, ardından bir istisna adı gelecek şekilde kullanmamız gerekir.ValueError fırlatma örneği
if/elsedeyiminde raise anahtar sözcüğü ekleyerek basitçe istisna fırlatabiliriz.Örnekte, değer 1.000'i aşarsa
ValueErrorfırlatıyoruz. Değeri 2.000 olarak değiştirdik; bu daifdeyiminiTRUEyaparak özel mesajlaValueErrorfırlatmasına neden oldu. Özel hata mesajı, sorunu hızlıca anlamanıza yardımcı olur.İstisna fırlatma örneği
Koşul sağlanırsa herhangi bir yerleşik Python istisnasını da fırlatabiliriz. Bizim durumumuzda, hata mesajıyla genel bir Exception fırlattık.
Fırlatılan istisnayı ele alma örneği
Kendi özel istisnamızı oluşturabilir ve
try-exceptbloğunu kullanarak istisnayı ele alabiliriz.Örnekte,
trydeyimi altına bir value error örneği ekledik.Peki nasıl çalışacak? İstisna fırlatıp programı sonlandırmak yerine, sağladığımız hata mesajını görüntüleyecek.
Bu tür istisna yönetimi, Python tarafından kapsanmayan ve uygulamanıza özgü gereksinimlere dair hatalara hazırlanmanıza yardımcı olur.
raise ... from ile istisna zincirleme
Bağımsız istisnalar fırlatmanın ötesinde,
raise ... fromkullanarak istisnaları zincirleyebilirsiniz. Bu, orijinal istisnayı bağlam olarak korur ve bir hatanın başka bir hataya neden olduğu durumlarda iz sürümlerini çok daha anlaşılır hale getirir.from ekısmı, yeni istisnanın__cause__özniteliğini ayarlar; böylece iz sürümünü okuyan herkes tam olarak neyin tetiklediğini görebilir. Bu, istisnaların kodun birden fazla katmanından geçtiği daha büyük uygulamalarda özellikle kullanışlıdır.İstisna Yönetimi için Python 3.10 - 3.13'te Neler Yeni?
Bu blog yazısı ilk yazıldığından beri 3.10 ve 3.11 gibi daha yeni Python sürümlerine önemli yenilikler eklendi:
1. Python 3.10'da yapısal desen eşleştirme (structural pattern matching)
Python 3.10,
matchdeyiminde hata türlerini eşleştirerek istisnaları daha sade biçimde ele almak için kullanılabilen yapısal desen eşleştirmeyi tanıttı. Bu, birden fazla istisna türüyle daha okunaklı şekilde uğraşırken özellikle yararlıdır. Örnek:2. İz sürümlerinde daha ince taneli hata konumları (Python 3.11)
Python 3.11'de iz sürümleri artık tam hata konumlarını göstererek istisnaların hata ayıklamasını kolaylaştırıyor.
Python 3.11 öncesi:
Python 3.11 ile iz sürümleri, istisnaya neden olan alt ifadeyi tam olarak işaretler:
3. İstisna grupları ve except* (Python 3.11)
Python 3.11,
except*kullanarak tek bir blokta birden çok istisnayı ele almak için istisna gruplarını tanıttı. Bu, eşzamanlı olmayan kodu yönetmek veya birden fazla istisnanın fırlatılabileceği senaryolar için kullanışlıdır. Örnek:4. İstisnalar için add_note yöntemi (Python 3.11)
İstisnalar artık geliştiricilerin daha iyi hata ayıklama için istisnalara özel notlar eklemesine olanak tanıyan bir
add_note()yöntemine sahip. Örnek:5. PEP 654: İç içe istisnaların daha iyi ele alınması
İstisna gruplarıyla, iç içe istisnaların hata ayıklaması ve ele alınması artık daha kolay; özellikle çoklu işlem veya eşzamanlı olmayan görevler gibi karmaşık iş akışlarında.
6. Geliştirilmiş hata mesajları (Python 3.12)
Python 3.12, hata mesajlarını daha spesifik ve eyleme dönük hale getirme yönündeki uzun soluklu çabayı sürdürdü. Örneğin,
NameErrormesajları artık kapsamda benzer isimli değişkenleri önerebiliyor; yaygın türlerdeki öznitelik hataları ise daha hedefli ipuçları veriyor:7. Renklendirilmiş iz sürümleri (Python 3.13)
Python 3.13, etkileşimli yorumlayıcıda varsayılan olarak renklendirilmiş iz sürümlerini tanıttı. Hata türleri, satır numaraları ve mesajlar artık farklı renklerle vurgulanıyor; özellikle birden çok zincirlenmiş istisnayı içeren uzun iz sürümlerinde neyin yanlış gittiğini taramak ve anlamak belirgin şekilde hızlandı.
Sonuç
Hem birim testleri hem de istisna yönetimi, kodunuzu üretime hazır ve hataya dayanıklı hale getiren Python programlamanın temel parçalarıdır. Bu eğitimde Python'da istisnalar ve hatalar ile bunların nasıl ele alınacağını öğrendik. Ayrıca, karmaşık iç içe try-except bloklarını ve gereksinimlere göre özel istisna blokları oluşturmayı da gördük.
Bu araçlar ve mekanizmalar gereklidir; ancak işin çoğu basit
tryveexceptbloklarıyla yapılır.try, kodun fırlattığı istisnaları arar;exceptise bu istisnaları ele alır.Eğer bu kafa karıştırıcı geldiyse ve nereden başlayacağınızı bilmiyorsanız, kapsamları, lambda fonksiyonlarını ve hata yönetimini anlamak için Introduction to Functions in Python kursumuzu tamamlayın. Ayrıca, kariyer becerileri kazanmak ve profesyonel bir Python geliştiricisi olmak için Python Programmer kariyer yoluna da kaydolabilirsiniz.