Lua - Hata Giderme
Hata İşleme İhtiyacı
Gerçek dünyadaki işlemler genellikle dosya işlemlerini, veritabanı işlemlerini ve web hizmeti çağrılarını içeren karmaşık işlemlerin kullanılmasını gerektirdiğinden, hata işleme oldukça kritiktir.
Herhangi bir programlamada her zaman hata işleme için bir gereklilik vardır. Hatalar, aşağıdakileri içeren iki türde olabilir:
- Sözdizimi hataları
- Çalışma zamanı hataları
Sözdizimi Hataları
Sözdizimi hataları, işleçler ve ifadeler gibi çeşitli program bileşenlerinin yanlış kullanımı nedeniyle oluşur. Sözdizimi hatası için basit bir örnek aşağıda gösterilmiştir.
a == 2
Bildiğiniz gibi, tek bir "eşittir" ve çift "eşittir" kullanımı arasında bir fark vardır. Birini diğerinin yerine kullanmak hataya neden olabilir. Bir "eşittir" atamaya, çift "eşittir" ise karşılaştırmaya atıfta bulunur. Benzer şekilde, önceden tanımlanmış uygulama yollarına sahip ifadelerimiz ve işlevlerimiz var.
Sözdizimi hatası için başka bir örnek aşağıda gösterilmiştir -
for a= 1,10
print(a)
end
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız -
lua: test2.lua:2: 'do' expected near 'print'
Sözdizimi hatalarının üstesinden gelmek, çalışma zamanı hatalarından çok daha kolaydır, çünkü Lua yorumlayıcı hatayı çalışma zamanı hatası durumunda olduğundan daha net bir şekilde bulur. Yukarıdaki hatadan, Lua yapısına göre print ifadesinden önce bir do ifadesi eklemenin gerekli olduğunu kolayca bilebiliriz .
Çalışma Süresi Hataları
Çalışma zamanı hataları durumunda, program başarılı bir şekilde yürütülür, ancak girişteki hatalar veya hatalı kullanılan işlevler nedeniyle çalışma zamanı hatalarına neden olabilir. Aşağıda, çalışma zamanı hatasını gösteren basit bir örnek gösterilmiştir.
function add(a,b)
return a+b
end
add(10)
Programı oluşturduğumuzda, başarılı bir şekilde kurulacak ve çalışacaktır. Çalıştıktan sonra, bir çalışma zamanı hatası gösterir.
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value)
stack traceback:
test2.lua:2: in function 'add'
test2.lua:5: in main chunk
[C]: ?
Bu, iki değişkenin aktarılmaması nedeniyle meydana gelen bir çalışma zamanı hatasıdır. b parametre bekleniyor ve burada sıfırdır ve bir hata oluşturur.
Onaylama ve Hata İşlevleri
Hataları işlemek için genellikle iki işlev kullanırız - assert ve error. Aşağıda basit bir örnek gösterilmektedir.
local function add(a,b)
assert(type(a) == "number", "a is not a number")
assert(type(b) == "number", "b is not a number")
return a+b
end
add(10)
Yukarıdaki programı çalıştırdığımızda aşağıdaki hata çıktısını alacağız.
lua: test2.lua:3: b is not a number
stack traceback:
[C]: in function 'assert'
test2.lua:3: in function 'add'
test2.lua:6: in main chunk
[C]: ?
error (message [, level])çağrılan son korumalı işlevi sonlandırır ve hata mesajı olarak mesaj döndürür. Bu işlev hatası asla geri dönmez. Genellikle hata, mesajın başına hata konumu hakkında bazı bilgiler ekler. Seviye argümanı, hata pozisyonunun nasıl alınacağını belirtir. Seviye 1 ile (varsayılan), hata pozisyonu, hata fonksiyonunun çağrıldığı yerdir. Düzey 2, hatayı, hata olarak adlandırılan işlevin çağrıldığı yere işaret eder; ve bunun gibi. Düzey 0'ı geçmek, mesaja hata konumu bilgisinin eklenmesini önler.
pcall ve xpcall
Lua programlamada, bu hataları atmaktan ve hataları işlemekten kaçınmak için pcall veya xpcall işlevlerini kullanmamız gerekir.
pcall (f, arg1, ...)işlev korumalı modda istenen işlevi çağırır. F fonksiyonunda bir hata oluşursa, bir hata oluşturmaz. Sadece hata durumunu döndürür. Aşağıda pcall kullanan basit bir örnek gösterilmektedir.
function myfunction ()
n = n/nil
end
if pcall(myfunction) then
print("Success")
else
print("Failure")
end
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız.
Failure
xpcall (f, err)işlev istenen işlevi çağırır ve ayrıca hata işleyiciyi ayarlar. F içindeki herhangi bir hata yayılmaz; bunun yerine, xpcall hatayı yakalar, err işlevini orijinal hata nesnesiyle çağırır ve bir durum kodu döndürür.
Xpcall için basit bir örnek aşağıda gösterilmiştir.
function myfunction ()
n = n/nil
end
function myerrorhandler( err )
print( "ERROR:", err )
end
status = xpcall( myfunction, myerrorhandler )
print( status)
Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız.
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false
Bir programcı olarak, yazdığınız programlarda uygun hata işlemeye özen göstermeniz çok önemlidir. Hata işlemeyi kullanmak, programın kullanıcısını rahatsız etmeden sınır koşullarının ötesindeki beklenmedik koşulların ele alınmasını sağlayabilir.