Добавлен , опубликован
Для какой версии: 131+
Для какого языка: 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
Предположим, у нас есть простенькая или не очень функция с кучей аргументов или минимум двумя
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
А что это такое вообще? не нужный рудимент
Это не рудимент, это подход к проектированию программы. Смысл его заключается в разделении и изоляции друг от друга логических блоков. Изоляции блока проверки произошедшего события и блока ответных на событие действий. Гарантия отсутствия мешанины из смеси проверок событий и непосредственного действия.
12
Я, конечно, знал, что динамическая типизация - это зло, но то, что Lua скомпилирует и запустит без выдачи ошибок функцию с заведомо недостаточным числом аргументов - это просто провал. Как такими языками программирования можно пользоваться в 2020-м году? Это, типа, фича такая, чтобы люди на грабли наступали побольше?
15
это просто провал.
Этот "провал" называется полиморфизмом. Причем истинной формой полиморфизма.
33
Sergarr, в точку, ну как бы есть ещё тайп скрипт, там таких ошибок не будет
28
Sergarr, это особенность языка. Компилятор Lua никак не может узнать, какая именно функция (и функция ли) будет на момент выполнения какого-то куска кода.
33
Как такими языками программирования можно пользоваться в 2020-м году? Это, типа, фича такая, чтобы люди на грабли наступали побольше?
С другой стороны всё в порядке, те единицы, что сидят на луа - знают что делают
29
GetLocalPlayer:
это просто провал.
Этот "провал" называется полиморфизмом. Причем истинной формой полиморфизма.
Нет не называется, причем тут полиморфизм?

Sergarr:
Я, конечно, знал, что динамическая типизация - это зло, но то, что Lua скомпилирует и запустит без выдачи ошибок функцию с заведомо недостаточным числом аргументов - это просто провал. Как такими языками программирования можно пользоваться в 2020-м году? Это, типа, фича такая, чтобы люди на грабли наступали побольше?
Т.к. синтаксического различия между обращением к локальной и глобальной переменной нет, то в случае несуществующей локальной переменной идет обращение к глобальной таблице переменных _G. На этапе компиляции нельзя понять есть или нет там определенная переменная.
22
ну а есть и продвинутый консоль для тестирование в игре
github.com/warcraft-iii/lib-console чтобы такой применить нужен установить github.com/warcraft-iii/warcraft-vscode в vscode и установить зависимость консоль
Не для слабонервных конечно =)

Тогда и можно ввыбрать из vscode режит разработчика или релиз
во время релиз убирает все рутинные работы проверка кода и всякие фичи в оптимизацию

А также укажет именно на файл где вы работаете src с нужным номер ошибки чем искать в итоговый результат в карте.

например main.lua ошибка будет там указано номер ошибки как и ты открыл редактор и писал
4
Почему при добавлении этого кода появляется такая странная ошибка? Причем тут стартовые локации? И ведь есть же endblock?
Загруженные файлы
4
prog:
Никита21, у вас карта точно в Lua режиме?
а как узнать? Карту отдал Anufis, я захотел починить под рефордж, там половина триггеров гуи, половина луа
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.