Этот пост, я ещё раз повторюсь, не столько про интернет-карточку, сколько про обработку ошибок. Даже assert поставить — это уже обработка ошибок.
local handle = assert(request(url, nil, nil, 5))
В коде из цитаты обработки ошибок нет. Ошибка если и есть, то теряется. Такой код проблему не решает и ещё порождает новые. Поэтому код неправильный.
Меня огорчает, что код скопирован, а времени то, чтобы понять, как он работает, не потрачено совершенно.
Внутри функции request находится цикл. Этот цикл ждёт соединения с сервером. timeout ограничивает время пребывания в этом цикле. Сколько ставить — это не мне решать, поэтому именно он и параметром к функции выведен. Зависит от программы.
Сетевые приложения никогда не были простыми. Исключительных случаев огромное множество, и за всеми надо уследить. В посте я постарался объяснить, зачем я использую свою обёртку и что именно она делает.
Я не могу дать полностью готовый кусок кода и сказать, что это канон. Самое универсальное — это функция request. Как использовать, зависит от приложения.
Здесь я нарисовал с assert пример — при любой ошибке программа будет крашиться. Удобно при разработке.
Если есть консольный интерфейс, надо ошибку обрабатывать явно. Например:
local handle, err
for i = 0, math.huge, 1 do
handle, err = request(url, nil, nil, 5)
if handle then
break
end
local delay = math.min(180, i ^ 3)
io.stderr:write([[
We've had a problem fetching a webpage: %s.
Retrying in %d seconds...]]):format(err, delay))
os.sleep(delay)
end
В посте как раз консольная программка, к слову.
Если интерфейс графический, ошибку писать надо куда-то ещё. Если программка автономная, то ошибку куда-то в лог класть.