RuntimeError nedir?

Merhaba;
Python hangi sorunla karşılaşınca RuntimeError hatası fırlatır? Mesela bir yerde şu kodun bu hatayı yükselteceğini duydum:

a = 1
while True:
    a += 1

Neden hata verir anlamadım. Üstelik bir ara şu da RuntimeError verdi:

for i, e in globals().items():
    print(i, e)

RuntimeError’un ingilizcesi çalışma zamanı hatası veya koşturma zamanı hatası. Yardımcı olursanız sevinirim.

Aşağıdaki linkte yazdığına göre hata verilmesi gereken bir anda diğer hata kategorilerine girmiyorsa bu isimde veriliyormuş.

https://docs.python.org/3.7/library/exceptions.html#RuntimeError

1 Beğeni

Hımm… İyi ama Run: koşturmak veya çalıştırmak ,time: zaman, error: hata demek. Çalışma zamanı hatasıyla ilgisi ne onu anlamadım. Bir de RunTimeError fırlatıldığında hatanın ne olduğunu nasıl bilebiliriz? Son olarak:

a = 1
while True:
    a += 1

Kodları neden tanımsız bir hata verebilir?

O belirli bir sayıya ulaşınca bu hatayı veriyor. O sayı ise os veya sys modülünde bir değişken olarak tutuluyor.

Amacı ise sonsuz döngüyü engellemek.

2 Beğeni

RuntimeError hatasına bakarsanız, şöyle bir ifade yer almaktadır:

RuntimeError: dictionary changed size during iteration

Yani yineleme sırasında sözlüğün uzunluğunu değiştirmeye çalışıyorsunuz bu yüzden RuntimeError hatası yükseltiliyor.

Mesela aşağıdaki kodları çalıştırın, globals()sözlüğünün elemanlarını inceleyin:

for i in "a":
    print(i)
    
print(globals())

Şöyle bir çıktı almanız lazım:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f821c8536d8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': './a2.py', '__cached__': None, 'i': 'a'}

Burada i de bir identifier (tanımlayıcı) olduğu için hata alırsınız.

Aynı ifadeyi bir fonksiyonun içine alırsanız hata almazsınız:

def f():
    for key, value in globals().items():
        print(key, value)
    

f()

veya aşağıdaki kod da hata vermez.

def f(x):
    for key, value in x.items():
        print(key, value)
    

f(globals())

Başka bir örnek:

dict_1 = {"a": 15, "b": 3, "c": 5}

dict_2 = {"a": 20, "b": 4, "c": 5}

dict_3 = {"a": 35, "b": 7, "c": 5}


def f(x):
    result = 0
    for key, value in x.items():
        if key.startswith("dict"):
            result += value["a"]
    return result
    # return sum(value["a"] for key, value in x.items() if key.startswith("dict"))


# f = lambda x: sum(map(lambda j: x[j]["a"], filter(lambda i: i.startswith("dict"), x)))


print(f(globals()))
1 Beğeni

Asil soruyu kimse cevaplamamis:

Runtime, programin calistigi zaman demek. Runtime error’in Turkcesi “program calisirken hata cikti”. “Ya ne zaman cikacakti?” diyebilirsiniz—runtime’in tersi compile time, yani programin derlendigi zaman. Python’da bu kategoride cok fazla hata yok; yanlis yazilmis bir degisken ismi bile o satir calisana kadar hata cikartmiyor—buyuk projelerde Python’in linter ve unit testler kullanilmasi mecburiyetinin sebebi de bu. Compile time error ariyorsaniz, asla cagirmadiginiz bir fonksiyonun icinde hata yapin. Programin geri kalaninin calismasini engelliyorsa buldunuz demektir. (En basidi SyntaxError)

Isimlendirme olarak RuntimeError cok kotu; exception listesine baktigimizda hemen hepsinin runtime’da firlatildigini goruyoruz. Bu sorunun varligi ve asil merak edilen kismin (hangi zamanlarda ortaya cikiyor) cevaplanamamis olmasi da kotu bir isim olduguna isaret ediyor. (Biri "StopIteration ne" diye sorsaydi cevaplamasi cok daha kolay olurdu.)

Kisaca diger kategorilere girmeyen calisma zamani hatalarinin konuldugu yer gibi gozukuyor.

2 Beğeni