Обработка ошибок Lua чистым и эффективным способом - PullRequest
2 голосов
/ 24 ноября 2011

Я сейчас пытаюсь написать для друга дополнение популярной игры World Of Warcraft.Я сам не очень разбираюсь в игре, и отладка ее внутри игры затруднительна, так как ему приходится выполнять все тесты.

Я довольно новичок в Lua, так что это может быть очень простой вопросотвечать.Но когда в WoW возникает ошибка Lua, она выбрасывает ее на экран и мешает, это очень плохо для игрока, поскольку он остановит игровой процесс, если выкинет исключение в неподходящее время.Я ищу способ аккуратно обработать выдаваемую ошибку.Вот мой код для этой функции.

function GuildShoppingList:gslSlashProc()
    -- Actions to be taken when command /gsl is procced.
    BankTab = GetCurrentGuildBankTab()
    BankInfo = GetGuildBankText(BankTab)
    local Tabname, Tabicon, TabisViewable, TabcanDeposit, TabnumWithdrawals, remainingWithdrawals = GetGuildBankTabInfo(BankTab)
    p1 = BankInfo:match('%-%- GSL %-%-%s+(.*)%s+%-%- ENDGSL %-%-')
    if p1 == nil then
        self:Print("GSL could not retrieve information, please open the guild bank and select the info tab allow data collection to be made")
    else
        self:Print("Returning info for: "..Tabname)
        for id,qty in p1:gmatch('(%d+):(%d+)') do
            --do something with those keys:
            local sName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(id);
            local iSum = qty/iStackCount
            self:Print("We need "..sLink.." x"..qty.."("..iSum.." stacks of "..iStackCount..")")
        end
    end
end

Проблема в том, что при проверке, чтобы увидеть, является ли p1 нулем, он все равно выдает ошибку Lua при попытке вызвать p1 как ноль.Это будет время от времени ноль, и это должно быть обработано правильно.

Каков наиболее эффективный способ сделать это?

1 Ответ

4 голосов
/ 24 ноября 2011

Возможно, вы захотите обернуть вашу функцию в pcall или xpcall , что позволит вам перехватить любую ошибку, выданную Lua.

Кроме того, мне лично легче читать эту конструкцию:

p1=string.match(str,pat)
if p1 then
    -- p1 is valid, eg not nil or false
else
    -- handle the problems
end
...