Для какой версии: 131+
Для какого языка: Lua
Назначение: Выводит сообщения об ошибке, причину и номер строчки в файле war3map.lua, где искать ошибку
Содержание:
Для какого языка: Lua
Назначение: Выводит сообщения об ошибке, причину и номер строчки в файле war3map.lua, где искать ошибку
Содержание:
local realTimerStart = TimerStart
TimerStart = function(timer, duration, repeating, callback)
local pcallback = function()
if callback == nil then return end
local status, err = pcall(callback)
if not status then
print(err)
end
end
realTimerStart(timer, duration, repeating, pcallback)
end
local realTriggerAddAction = TriggerAddAction
TriggerAddAction = function(trig, callback)
local pcallback = function()
local status, err = pcall(callback)
if not status then
print(err)
end
end
realTriggerAddAction(trig, pcallback)
end
Установка: Скопировать код себе в карту в любое место
Примеры использования:
Примеры использования:
Пример №1
Делаем намеренную и частую ошибку, например забыли передать аргумент
A=nil+1
Предположим, у нас есть простенькая или не очень функция с кучей аргументов или минимум двумя
A=nil+1
Предположим, у нас есть простенькая или не очень функция с кучей аргументов или минимум двумя
function sum(a,b)
return a+b
end
Она понятно что делает, это просто пример и вот мы хотим её использовать
print(sum(1))
И ой, кажется случайно забыли передать второй аргумент, ни родной редактор ни vscode ни idea в режиме луа не выдадут никакой ошибки, потому что луа - язык с динамической типизаций, вот они проблемы это типизации. Надо быть на 200% внимательным чтобы не совершать таких ошибок.
По факту код без аргумента превращается в
По факту код без аргумента превращается в
print(sum(1,nil))
А внутри происходит
return a+nil
Что равно просто остановке выполнения потока, а чё-то мой код сохранился без ошибок, а карта не работает
А вот и то самое сообщение, где искать ошибку и почему она произошла
А вот и то самое сообщение, где искать ошибку и почему она произошла
Карта от этого особо не сломается, но большое накопление таких ошибок способно вызывать фаталы или же десинхронизацию, особенно если поток прерывает внутри действий локального игрока
Пример №2
Поменяем аргументы в функции местами (случайно, по запаре, а последний вообще забудем написать)
Верный код
CreateUnit(Player(0),FourCC('hpea'),0,0,180)
Наш код с ошибкой
CreateUnit(FourCC('hpea'),Player(0),0,0)
Ну и разумеется получаем ошибку, что неправильно передали игрока, в какой строке и в каком аргументе
код для теста
function sum(a,b)
return a+b
end
do --Инициализация
TimerStart(CreateTimer(), 0.1, false, function()
print(sum(1))
--CreateUnit(Player(0),FourCC('hpea'),0,0,180)
--CreateUnit(FourCC('hpea'),Player(0),0,0)
end)
end
Ред. Берги
сайта. Советую начать xgm.guru/p/wc3/articles, если делать как там написано, то крашей у вас не будет
Ред. Берги
Ред. PT153