Есть файл №2 со скриптом Lua подключаемый в основной скрипт Lua №1 через dofile(). Можно как-то создать исключение если в этом файле №2 есть ошибка - проигнорировать его и не прерывать работу скрипта №1. Проводимые вычисления и операции в скрипте №2 никак не затрагивают работу скрипта №1.
Функция pcall вызывает функцию f с аргументами, переданными в параметрах и возвращает результат успешности вызова функции. Если функция f была вызвана успешно, то остальные возвращаемые значения pcall являются результатом вызова функции f, иначе второе возвращаемое значение является сообщением об ошибке. Например:
local callResult, result = pcall(dofile, fileName)
if callResult then
-- все в порядке, result это то, что вернула функция dofile
else
-- result это сообщение об ошибке
print(result)
end
Второй способ загрузки файла использует переключение окружения и уже знакомую функцию loadfile:
-- загружаем чанк из файла
local result
local func, errorMsg = loadfile('data2.lua')
if func then
-- создаем таблицу для окружения,
-- в котором будет выполняться функция func
local P = {}
-- устанавливаем окружение для функции func
setfenv(func, P)
-- вызываем функцию func
func()
-- все "глобальные" переменные,
-- объявленные внутри чанка, попадут в таблицу P
result = P.a
else
print(errorMsg)
end
Но хотелось бы понимать чем они отличаются друг от друга.
Второй метод спасет только от формальных синтаксических ошибок в коде. Если синтаксически код корректен, но возникнет ошибка при исполнении (обращение к необъявленной переменной, например) - то второй метод не спасет. А первый - спасёт, для того и предназначен