LU Lua  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Ошибки, pcall и xpcall

Тест по теме «Ошибки, pcall и xpcall» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 20 вопросов, из них 10 содержат фрагменты Lua. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 55 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 20
Результат здесь задаёт не соглашение проекта, а правило языка. Какое? Ответ должен описывать основной механизм раздела «Создание ошибки через error».
LuaLua · Создание ошибки через error · разбор 1
local function parse_port(s)
  local n = tonumber(s)
  if not n or n < 1 or n > 65535 then error("bad port", 2) end
  return n
end
print(parse_port("8080"))
Вопрос 2 из 20
Какую границу стоит сделать явной в регрессионной проверке? Нужен отрицательный сценарий для раздела «Создание ошибки через error».
LuaLua · Создание ошибки через error · разбор 2
local function reproduce_case()
  local function parse_port(s)
    local n = tonumber(s)
    if not n or n < 1 or n > 65535 then error("bad port", 2) end
    return n
  end
  print(parse_port("8080"))
end
reproduce_case()
Вопрос 3 из 20
Что нельзя считать деталью реализации в этом коде? Нужен основной контракт раздела «Создание ошибки через error».
LuaLua · Создание ошибки через error · разбор 3
do
  local function parse_port(s)
    local n = tonumber(s)
    if not n or n < 1 or n > 65535 then error("bad port", 2) end
    return n
  end
  print(parse_port("8080"))
end
Вопрос 4 из 20
Нужно сделать поведение «Создание ошибки через error» предсказуемым для следующего разработчика. Что выбрать? Выберите практическое следствие раздела «Создание ошибки через error».
Вопрос 5 из 20
Что должен помнить разработчик, впервые работающий с разделом «Создание ошибки через error»? Ответ должен охватывать весь раздел «Создание ошибки через error».
Вопрос 6 из 20
Что именно объясняет поведение строки «print(ok, state.count, err~=nil)»? Выберите основное правило раздела «Защищённый вызов».
LuaLua · Защищённый вызов · разбор 1
local state={count=0}
local ok,err=pcall(function()
  state.count=state.count+1
  error("failed")
end)
print(ok, state.count, err~=nil)
Вопрос 7 из 20
Что следует изменить во входе, чтобы проверить скрытое ограничение? Выберите именно проверяемую границу раздела «Защищённый вызов».
LuaLua · Защищённый вызов · разбор 2
local function reproduce_case()
  local state={count=0}
  local ok,err=pcall(function()
    state.count=state.count+1
    error("failed")
  end)
  print(ok, state.count, err~=nil)
end
reproduce_case()
Вопрос 8 из 20
Что нельзя считать деталью реализации в этом коде? Речь идёт о центральном правиле раздела «Защищённый вызов».
LuaLua · Защищённый вызов · разбор 3
do
  local state={count=0}
  local ok,err=pcall(function()
    state.count=state.count+1
    error("failed")
  end)
  print(ok, state.count, err~=nil)
end
Вопрос 9 из 20
Для раздела «Защищённый вызов» выбирают между коротким трюком и ясным контрактом. Что предпочтительнее? Ответ должен выражать проверяемое следствие раздела «Защищённый вызов».
Вопрос 10 из 20
Что следует считать рабочим контрактом раздела «Защищённый вызов»? Нужна полная формулировка раздела «Защищённый вызов».
Вопрос 11 из 20
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Ответ должен описывать основной механизм раздела «Трассировка стека».
LuaLua · Трассировка стека · разбор 1
local function handler(err)
  return debug.traceback("request failed: "..tostring(err), 2)
end
local ok, msg = xpcall(function() error("db") end, handler)
print(ok, msg:match("request failed")~=nil)
Вопрос 12 из 20
Какой крайний случай важнее всего добавить к проверке? Нужен отрицательный сценарий для раздела «Трассировка стека».
LuaLua · Трассировка стека · разбор 2
local function reproduce_case()
  local function handler(err)
    return debug.traceback("request failed: "..tostring(err), 2)
  end
  local ok, msg = xpcall(function() error("db") end, handler)
  print(ok, msg:match("request failed")~=nil)
end
reproduce_case()
Вопрос 13 из 20
После рефакторинга тесты должны защищать одно правило. Какое? Речь идёт о центральном правиле раздела «Трассировка стека».
Вопрос 14 из 20
Решение по разделу «Трассировка стека» должно пережить обновление зависимости. Что фиксировать в контракте? Нужна эксплуатационная граница раздела «Трассировка стека».
Вопрос 15 из 20
Какое правило раздела «Трассировка стека» стоит закрепить в тестах? Выберите описание, объединяющее механизм и границу раздела «Трассировка стека».
Вопрос 16 из 20
Что нужно знать о Lua, прежде чем предсказывать результат этого кода? Нужна именно центральная гарантия раздела «Стратегия восстановления».
LuaLua · Стратегия восстановления · разбор 1
local function update(model, patch)
  local snapshot = model.value
  local ok, err = pcall(function()
    model.value = assert(patch.value)
    assert(model.value >= 0)
  end)
  if not ok then model.value = snapshot end
  return ok, err
end
Вопрос 17 из 20
Какой отказ должен быть воспроизводимым в тесте? Выберите именно проверяемую границу раздела «Стратегия восстановления».
LuaLua · Стратегия восстановления · разбор 2
local function reproduce_case()
  local function update(model, patch)
    local snapshot = model.value
    local ok, err = pcall(function()
      model.value = assert(patch.value)
      assert(model.value >= 0)
    end)
    if not ok then model.value = snapshot end
    return ok, err
  end
end
reproduce_case()
Вопрос 18 из 20
Код переписывают без изменения внешнего поведения. Какой контракт должен сохраниться? Речь идёт о центральном правиле раздела «Стратегия восстановления».
Вопрос 19 из 20
Команда меняет раздел «Стратегия восстановления» в рабочем модуле. На какое решение можно опереться при повторном запуске и отказе зависимости? Ответ должен выражать проверяемое следствие раздела «Стратегия восстановления».
Вопрос 20 из 20
Что должен помнить разработчик, впервые работающий с разделом «Стратегия восстановления»? Нужна полная формулировка раздела «Стратегия восстановления».

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу