Модуль errno
Символьное обозначение стандартных ошибок
Модуль errno
в Python предоставляет набор ошибок, которые возникают при системных вызовах. Эти ошибки представлены в виде целочисленных констант и часто возникают при работе с файлами, сокетами и другими ресурсами.
EACCES
Недостаточно прав для выполнения операции. Эта ошибка возникает, когда у процесса нет необходимых разрешений для доступа к файлу или ресурсу.
EADDRINUSE
Адрес уже используется. Эта ошибка возникает, когда программа пытается назначить сокету локальный адрес, который уже занят другим процессом.
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 8080))
except OSError as e:
if e.errno == errno.EADDRINUSE:
print("Адрес уже используется.")
EAGAIN
Временная ошибка, требующая повторения операции. Обычно используется с неблокирующими операциями, которые не могут быть выполнены немедленно.
EALREADY
Операция уже выполняется. Возникает, когда попытка соединения уже инициирована.
import socket, errno
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 8080))
s.connect(('localhost', 8080)) # Попытка повторного соединения
except ConnectionError as e:
if e.errno == errno.EALREADY:
print("Соединение уже выполняется.")
EBADF
Неверный файловый дескриптор. Возникает, когда операция вызывается для несуществующего или неподобающего дескриптора.
ECONNABORTED
Соединение прервано. Оговорённое соединение было неожиданно разорвано.
import socket
try:
s = socket.socket()
# Допустим, соединение установлено и затем прервано
# Это место для вставки кода управления соединением
except ConnectionAbortedError as e:
if e.errno == errno.ECONNABORTED:
print("Соединение было прервано.")
ECONNREFUSED
Соединение отклонено. Сервер отказался установить соединение, так как сервис на порту недоступен.
import socket, errno
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 12345))
except ConnectionRefusedError as e:
if e.errno == errno.ECONNREFUSED:
print("Соединение отклонено.")
ECONNRESET
Сброс соединения. Соединение было принудительно разорвано другой стороной.
import socket
try:
s = socket.socket()
# Сценарий с сервером, который сбрасывает соединения
except ConnectionResetError as e:
if e.errno == errno.ECONNRESET:
print("Соединение было сброшено другой стороной.")
EEXIST
Файл уже существует. Возникает при попытке создания файла, который уже существует.
EHOSTUNREACH
Хост недоступен. Не удается достичь удалённого хоста.
import socket
try:
s = socket.socket()
s.connect(('192.0.2.1', 80)) # Используемый для демонстрационных целей адрес
except OSError as e:
if e.errno == errno.EHOSTUNREACH:
print("Хост недоступен.")
EINPROGRESS
Операция в процессе выполнения. Используется в неблокирующих сокетах во время установления соединения.
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(False)
s.connect(('localhost', 8080))
except BlockingIOError as e:
if e.errno == errno.EINPROGRESS:
print("Соединение в процессе выполнения.")
EINVAL
Неправильный аргумент. Тип или значение аргумента не подходит для вызова.
EIO
Ошибка ввода-вывода. Общая ошибка работы с устройством или файлом.
EISDIR
Операция не может быть выполнена, поскольку объект является директорией.
ENOBUFS
Недостаточно буферов. Является системной ошибкой в сокетах.
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except OSError as e:
if e.errno == errno.ENOBUFS:
print("Недостаточно буферной памяти.")
ENODEV
Устройство не существует. Операция запрашивает устройство или адресное пространство, которого не существует.
ENOENT
Нет такого файла или директории. Обычная ошибка при попытке доступа к несуществующему объекту.
ENOMEM
Недостаточно памяти для выполнения операции. Обычно возникает при недостатке оперативной памяти.
try:
large_list = [0] * (10**10) # Попытка выделить очень большой объем памяти
except MemoryError as e:
if e.errno == errno.ENOMEM:
print("Недостаточно памяти.")
ENOTCONN
Сокет не подключен. Ожидалась работа с соединённым сокетом, но он ещё не был подключен.
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.send(b'data')
except OSError as e:
if e.errno == errno.ENOTCONN:
print("Сокет не подключен.")
EOPNOTSUPP
Операция не поддерживается. Системный запрос или манипуляция не поддерживается.
import socket
try:
s = socket.socket()
s.bind(('localhost', 0, 0)) # Неправильное использование bind
except OSError as e:
if e.errno == errno.EOPNOTSUPP:
print("Операция не поддерживается.")
EPERM
Отказ в операции. Недостаточные привилегии для выполнения операции.
ETIMEDOUT
Время ожидания соединения истекло. Соединение не было установлено за заданный промежуток времени.
import socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect(('10.255.255.1', 80)) # Ненастраиваемый адрес, чтобы вызвать timeout
except OSError as e:
if e.errno == errno.ETIMEDOUT:
print("Время ожидания соединения истекло.")
errorcode
Это словарь, предоставляемый модулем errno
, который связывает числовые значения ошибок с их символическими именами.
import errno
error_number = 1 # Например, число для EPERM
print(errno.errorcode[error_number]) # Выведет: 'EPERM'