Подтвердить что ты не робот

Python обрабатывает конкретные коды ошибок?

Эй, мне интересно, как обращаться с конкретными кодами ошибок. Например, [Errno 111] Connection refused

Я хочу уловить эту конкретную ошибку в модуле сокета и что-то напечатать.

4b9b3361

Ответ 1

Если вы хотите получить код ошибки, похоже, это поможет;

import errno

try:
    socket_connection()
except socket.error as error:
    if error.errno == errno.ECONNREFUSED:
        print(os.strerror(error.errno))
    else:
        raise

Вы можете посмотреть errno коды ошибок.

Ответ 2

На платформах Unix, по крайней мере, вы можете сделать следующее.

import socket, errno
try:
    # Do something...
except socket.error as e:
    if e.errno == errno.ECONNREFUSED:
        # Handle the exception...
    else:
        raise

Перед Python 2.6 используйте e.args[ 0 ] вместо e.errno.

Ответ 3

Я работаю над Windows и оказался в том же затруднительном положении. Но сообщение об ошибке всегда содержит номер ошибки. Используя эту информацию, я просто конвертирую исключение в строку str(Exception), конвертирую код ошибки, я хочу проверить на строку str(socket.errno.ERRORX) и проверить, не является ли код ошибки в исключении.

Пример подключения reset exception:

except Exception as errorMessage:
    if str(socket.errno.ECONNRESET) in str(errorMessage):
        print("Connection reset")
        #etc...

Это позволяет избежать локальных конкретных решений, но до сих пор не является независимым от платформы.

Ответ 4

Кажется, что это трудно сделать надежно/переносимо, но возможно что-то вроде:

import socket

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('localhost', 4167))
except socket.error, e:
    if 'Connection refused' in e:
        print '*** Connection refused ***'

который дает:

$ python socketexception.py 
*** Connection refused ***

Довольно yucky хотя.