На какие ошибки ввода-вывода падать, а какие пытаться исправить?
Я начинающий программист на Rust, пишу бекенды и чувствуя что в продакшене нельзя просто падать на все ошибки ввода-вывода столкнулся с вопросом их корректной обработки.
Понятно что делать если файла нет, прав нет, место кончилось или файл занят, но как быть с такими линуксовыми ошибками?
EIO (I/O error)
EINTR (Interrupted system call) //что вообще могло прервать системный вызов?
EL2NSYNC (Level 2 not synchronized)
EL3HLT (Level 3 halted)
EL3RST (Level 3 reset)
ENOANO (No anode)
Каков вообще тот список ошибок которые вообще имеет смысл обрабатывать если мы говорим о работе с локальными файлами и сокетами? На какие ошибки стоит убивать проблемный поток, но продолжать работу? А может есть какие-то ошибки при которых стоит паниковать и не пытаясь что-либо сохранить сразу падать?
Читайте маны по системным вызовам и принимайте решение, что вы будете делать с ошибками.
Обычно есть 3 вида реакции на ошибки:
1.выдать сообщение и завершиться
2.повторить операцию (EINTR, EAGAIN), возможно не сразу
3.игнорировать (редкий случай, например когда выставляете слушающему сокету опцию SO_REUSEADDR)
EINTR - эта ошибка возвращается, когда во время системного вызова приложению приходит сигнал. Реакция зависит от того, как вы обрабатываете сигналы - если перехватываете для корректного освобождения ресурсов или еще для чего-нибудь, то есть смысл просто повторить операцию.
EIO - низкоуровневая ошибка. Обычно требуется вмешательство человека.
В общем подходите к обработке ошибок осознано, в зависимости от того, какое поведение требуется в данном конкретном случае. Каких-то единых рекомендаций тут быть не может.
Исключения I/O - одни из самых сложных п принятии решения. Это связано с тем что сеть - это часть внешнего мира. Того на который ты не влияешь. В чем может быть причина? На каждый класс ошибок и на каждый источник данных должна быть таблица принятия решений. Например ты знаешь что в каждый четверг данный rest сервис имеет возможный регламент обновлений. Выдавай на UI плитку с сообщением о регламенте и проси повторить через какое то время. А другий рест сервис просто висит на слабом канале. И к нему надо применять RetryLogic. Молча. Просто другого выхода нет.