Lua Hata Açıklamaları

Lua Hataları Nedir?

Bir Lua hatası, çalıştırılan kodun hatalı olması durumunda meydana gelir. Bir Lua hatasının oluşmasının birçok nedeni olabilir, ancak bir Lua hatasının ne olduğunu ve nasıl okunacağını anlamak, her geliştiricinin sahip olması gereken önemli bir beceridir.

Hataların Betikleriniz Üzerindeki Etkileri

Bir hata meydana geldiğinde betiğinizin çalışmasını durdurur. Bu, bir hata fırlatıldığında, betiğinizin bazı öğelerinin tamamen bozulabileceği anlamına gelir. Örneğin, oyun modunuzda init.lua'nın çalışmasını engelleyen bir sözdizimi hatası varsa, tüm oyun modunuz bozulacaktır.

Lua Hata Formatı

Lua hatasının ilk satırı 3 önemli bilgi içerir:

  • Hataya neden olan dosyanın yolu
  • Hataya neden olan satır
  • Hatanın kendisi

İşte bir Lua hatasına neden olacak bir kod örneği:

local text = "Hello World" Print( text )

Kod aşağıdaki hatayı üretecektir:

[ERROR]addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua:2: attempt to call global 'Print' (a nil value) 1. unknown - addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua:2

Bunun nedeni Print'in mevcut bir fonksiyon olmamasıdır (ancak print mevcuttur).

İlk satır, hataya neden olan dosyanın yolunu içerir - addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua

Ardından, hatayı üreten satır - sv_my_addon_autorun.lua:2 (Satır 2)

Son olarak, hatanın kendisi - attempt to call global 'Print' (a nil value)

Hatanın altında, fonksiyonun izini (trace) görürüz. Basitçe - Eğer hata, başka bir yerden çağrılan bir fonksiyon/kod parçacığı içindeyse, kodun nereden çağrıldığı belirtilecektir.

Eğer hata sunucu taraflı (serverside) ise, metin rengi mavi olacaktır. Eğer istemci taraflı (clientside) olduysa, sarı olacaktır. Eğer menü kodu ise, yeşil olacaktır (tipik bir senaryo değildir). Hata gibi görünen ancak kırmızı veya beyaz gibi farklı renkte olan mesajlar Lua hataları değil, oyun motoru (engine) hatalarıdır.

Kendi Hatanızı Yazdırmak

Kendi hata mesajlarınızı yazdırmak isterseniz, bunu yapmak için üç fonksiyon vardır:

  • error, mesajınızı yazdırır, çalışmayı durdurur ve yığını (stack) yazdırır. Normal hata davranışıdır.
  • ErrorNoHalt, betiği durdurmadan dosya/satır numarasını ve mesajınızı yazdırır. Uyarı mesajları için kullanışlıdır.
  • assert, bir şeyin doğru olduğundan emin olmak için kontrol eder. Eğer doğru değilse, mesajınızı yazdırır ve tıpkı error gibi çalışmayı durdurur.

Yaygın Hatalar

Attempt to call global '?' a nil value

Açıklama: Var olmayan bir fonksiyonu çağırmaya çalıştınız.

Olası nedenler:

  • Fonksiyonunuz başka bir Lua alanında (state) tanımlanmış olabilir. (ör. Yalnızca sunucuda* var olan bir fonksiyonu istemcide çağırmak.)
  • Yanlış türde bir nesne üzerinde bir meta fonksiyon (metafunction) kullanıyorsunuz. (ör. Bir Vektör (Vector) üzerinde :SteamID() çağırmak)
  • Çağırdığınız fonksiyonda bir hata var, bu da onun tanımlanmadığı anlamına geliyor.
  • Fonksiyonun adını yanlış yazdınız.

Düzeltme yolları:

  • Fonksiyonun var olduğundan emin olun
  • Fonksiyonunuzun doğru alanda (realm) tanımlandığından emin olun
  • Fonksiyon çağrılarınızı yazım hataları için kontrol edin

Attempt to perform arithmetic on global '?' (a nil value)

Açıklama: Tanımlanmamış bir global değişken üzerinde aritmetik işlem (+, -, *, /) yapmaya çalıştınız.

Olası nedenler:

  • Kodun ilerleyen kısımlarında tanımlanmış bir yerel (local) değişkeni kullanmaya çalıştınız
  • Global değişkenin adını yanlış yazdınız

Düzeltme yolları:

  • Yerel değişkenleri kodda çağırmadan önce tanımladığınızdan emin olun
  • Yazım hatalarını kontrol edin

Attempt to perform arithmetic on '?' (a type value)

Açıklama: Aritmetik işlem yapılamayan bir değişken üzerinde aritmetik işlem (+, -, *, /) yapmaya çalıştınız. (ör. 2 + "bir metin")

Attempt to index global 'varname' (a nil value)

Açıklama: Tanımsız bir değişkeni indekslemeye çalıştınız (ör. variable tanımsızken print( variable.index ) kullanmak)

Olası nedenler:

  • Değişken farklı bir alanda (realm) tanımlanmış
  • Değişken yerel (local) ve kodun ilerleyen kısımlarında tanımlanmış
  • Değişkenin adını yanlış yazdınız

Düzeltme yolları:

  • Değişkenin yalnızca tanımlandığı alanda (realm) erişildiğinden emin olun
  • Eğer değişken yerel (local) ise, ona erişmeden önce tanımlayın

Malformed number near 'number'

Açıklama: Kodda hatalı biçimlendirilmiş bir sayı var (ör. 1.2.3, 2f)

Olası nedenler:

  • Bir IP adresi, metin (string) yerine sayı olarak yazılmış
  • Bir sayı ile bir değişkenin çarpımının yanlış yazılması
  • Sayı ile operatör arasında boşluk bırakmadan bir sayıyı bir metne birleştirmeye (concatenate) çalışmak.

Düzeltme yolları:

  • IP adreslerini metin (string) olarak saklayın
  • Değişkenleri sayılarla çarpmak için `*` operatörünü kullanın
  • Birleştirme (..) operatörü ile sayı arasına bir boşluk koyun.

Unexpected symbol near 'symbol'

Açıklama: Kodda Lua'nın nasıl yorumlayacağını bilmediği bir sembol yazdınız.

Olası nedenler:

  • Yanlış sözdizimi (syntax) (ör. Bir if ifadesinden sonra "then" yazmayı unutmak)
  • Köşeli parantezleri ve parantezleri doğru yerlerde kapatmamak

Düzeltme yolları:

  • Kodda yazım hatası olmadığından emin olun
  • Köşeli parantezleri ve parantezleri doğru şekilde kapatın (Bakınız: Kod Girintileme)

'symbol1' expected near 'symbol2'

Açıklama: Lua, symbol2 yerine symbol1 bekliyordu. 'symbol2' <eof> (dosya sonu) olduğunda, Lua dosyanın sonundan önce bir sembol bekliyordu

Olası nedenler:

  • Dosyanın sonundan önce tüm köşeli parantezleri, parantezleri veya fonksiyonları kapatmamak
  • Çok fazla end ifadesine sahip olmak
  • Yanlış operatör çağırma (ör. "=" yerine "==")
  • Tablo (table) öğesinden sonra virgül eksikliği.

Düzeltme yolları:

  • Köşeli parantezleri ve parantezleri doğru şekilde kapatın (Bakınız: Kod Girintileme)
  • Doğru operatörleri kullanın
  • Bir tablo (table) öğesinden sonra virgül ekleyin

Couldn't include file 'file' - File not found (<nowhere>)

Açıklama: Dosya sistemi, ya var olmayan ya da sunucu çalışırken eklenmiş bir dosyayı dahil etmeye (include) çalıştı. Bu hata aynı zamanda bir AddCSLuaFile hatası da olabilir.

Olası nedenler:

  • Var olmayan veya boş bir dosyayı dahil etmeye (include) / `AddCSLuaFile` yapmaya çalışmak
  • Sunucu hala çalışırken bir dosya oluşturmak

Düzeltme yolları:

  • Var olmayan dosyayı ekleyin, dosyanın boş olmadığından emin olun
  • Sunucuyu yeniden başlatın

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord