dofile в защищённом режиме

Страницы: 1
RSS
dofile в защищённом режиме
 
В файле tbl.lua лежит небольшая таблица вида:
Код
t={
a=100
b=200
}

Но иногда в этом файле могут быть кривые данные. Если вызывать этот файл с помощью dofile (tbl.lua), могут быть ошибки и основной скрипт остановится с ошибкой.
Как написать в духе:

dofile (tbl.lua), но если там нечитаемый бред, то идти дальше и не обновлять таблицу t (пользоваться старой).
 
Вам поможет pcall или xpcall
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Вам поможет pcall или xpcall
ооо, спасибо!
который раз уже спасаете :)
Вроде бы получилось, и не выбивает если в файле написать кривулины
Вы это имели в виду или можно понадёжнее сделать?
Код
function main()
   while is_run do
   pcall(foo)
   mm(t)--печать в виде message таблицы из файла.
   sleep(1000)
   end
end

function foo()
   dofile ("C:\\1.lua")--здесь сидит таблица t
end
 
Ну да, типа такого. Можно ещё посмотреть на возвращаемое значение pcall
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Интересно, зачем   dofile ("C:\\1.lua")  вынесли в отдельную функцию. Это связано с локализацией возможной ошибки или совсем другая причина? Я бы оставил в  main  до бесконечного цикла.
pcall(foo)- собственно, какую ошибку пытаетесь поймать? Подключился ли файл  ("C:\\1.lua")? К содержанию  таблицы не имеет отношение.
На сколько я понял Ваш файл - это файл с данными и в нем не происходит никаких операций.  Зачем его подключать через  dofile?
Мне интересен способ обработки ошибки, которая может возникнуть в самом файле, подключенном через dofile или легче это сделать, например, подключившись через require?
 
 
Цитата
Новое сообщение на форуме пользователей QUIK в теме «dofile в защищённом режиме»
от пользователя dygroutty:
http://forum.quik.ru/messages/forum10/message33659/topic3970/#message33659

Управление
подпиской:
http://forum.quik.ru/subscribe/

Дата:
23.09.2018
16:17:59
____________________________________________

Сообщение
сгенерировано автоматически.

Несмотря на то, что уже отписался от ветки, уведомления о новом спаме всё равно приходят. Весь день!
 
Цитата
s_mike@rambler.ru написал:
Ну да, типа такого. Можно ещё посмотреть на возвращаемое значение pcall
хм... а как мне в функцию foo передать параметр?
Код
function main()
   while is_run do
   pcall(foo("privet"))
   mm(t)--печать в виде message таблицы из файла.
   sleep(1000)
   end
end

function foo(slovo)
   a=slovo
   dofile ("C:\\1.lua")--здесь сидит таблица t
end
выдаёт ошибку bad argument #1 to 'pcall' (value expected)
 
Цитата
Let_it_go написал:
Цитата
   s_mike@rambler.ru написал:
Ну да, типа такого. Можно ещё посмотреть на возвращаемое значение pcall
хм... а как мне в функцию foo передать параметр?
Код
   function   main ()
    while  is_run  do 
   pcall(foo( "privet" ))
   mm(t) --печать в виде message таблицы из файла. 
    sleep ( 1000 )
    end 
 end 

 function   foo (slovo)
   a = slovo
   dofile ( "C:\\1.lua" ) --здесь сидит таблица t 
 end   
выдаёт ошибку bad argument #1 to 'pcall' (value expected)
Блин, ну Вы бы хоть гуглили для начала...

pcall принимает функцию, значит, нужно передать ему функцию:


Код
pcall (function() foo("privet) end)
 
Цитата
Let_it_go написал:
хм... а как мне в функцию foo передать параметр?
Обращайтесь к мануалу по Lua. Вот же ответ на Ваш вопрос: https://www.lua.org/manual/5.1/manual.html#pdf-pcall

Цитата
Enfernuz написал:
pcall принимает функцию, значит, нужно передать ему функцию:
Код
  pcall ( function () foo("privet)  end )
Такое обворачивание нужно только для xpcall, который в Lua 5.1 ещё не умеет принимать аргументы для принимаемой функции (в Lua 5.2 уже умеет).

Для pcall достаточно делать так:
Скрытый текст
 
Подскажите пожалуйста как этой функцией pcall обернуть функцию main?
Чтобы если внутри main окажется ошибка nil, то скрипт не вылетал, а продолжал работать.
 
Цитата
Let_it_go написал:
Подскажите пожалуйста как этой функцией pcall обернуть функцию main?
Чтобы если внутри main окажется ошибка nil, то скрипт не вылетал, а продолжал работать.
function new_main()

-- это ваша новая main()
end

function main()

pcall(main1)
end
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
исправить сообщение на этом форуме невозможно (f..k), поэтому приходится писать новое сообщение вместо того чтобы исправить предыдущее.


function new_main()

-- это ваша новая main()
end

function main()

pcall(new_main)
end
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
pay people to write essays
paper writing service  online essay services
custom writing - help writing essay paper
research methodology thesis
 
Цитата
s_mike@rambler.ru написал:
исправить сообщение на этом форуме невозможно (f..k), поэтому приходится писать новое сообщение вместо того чтобы исправить предыдущее.
function new_main()
-- это ваша новая main()
end
function main()
pcall(new_main)
end
Работает!
А как мне отлавливать ошибки?
Точнее "где их отлавливать"?
Такой вариант ничего не возвращает.

 
Pcall возвращает статус и текст ошибки, если она имеется. Смотрите документацию на эту функцию.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Мне "болванка" кода использующего обертку в pcall представляется примерно так:
Код
is_run = true
TimeOut = 500

function ErrorFunction()
    -- имитируем код генерирующий ошибку
    s=a
end

function main()
local CallSuccess
    while is_run do
        -- Безопасно вызываем функцию которая может выдать ошибку
        [список возможных результатов] CallSuccess = pcall(ErrorFunction[, другие возможные аргументы])
        if CallSuccess then
            -- Вызов успешен, анализируем результаты (если предусмотрено)
        else
            -- Здесь какая-то работа над ошибками
        end
        sleep(TimeOut)
    end
end
В квадратных скобках как обычно параметры которые могут быть или не быть.
Страницы: 1
Читают тему
Наверх