Почему возникает Exception в блоке try/except, не равном HTTPError в методе при сравнении?

  • Цель: передать исключение из блока try, кроме метода, чтобы определить пользовательский вывод для пользователя на основе типа ошибки, не используя request.status_code для указания каждого кода ошибки.
  • Чего я ожидал: error == HTTPError будет равняться True, а не False.
  • Что я пробовал: несколько вариантов от HTTPError до requests.exceptions.HTTPError, а также просто искал здесь, а также в Google, но не нашел того, что искал.

Когда я встречаю или вызываю исключение HTTPError и передаю исключение как e методу, аргумент, передаваемый методу, не равен HTTPError. (Я понимаю, что это не лучшая практика для import *, но для целей тестирования это упрощает ситуацию.)

Когда я отлаживаю его и проверяю типы и равенство исключений по всей программе, я получаю следующее:

e == HTTPError
False

error == HTTPError
False

type(error)
<class 'requests.exceptions.HTTPError'>

type(HTTPError)
<class 'type'>

Код:


from requests import *


def returnError(error : exceptions) -> dict:
    """ Returns an updated dictionary with corresponding message matching the error """
    if error == HTTPError:
            result = {}
    return result

try:
    raise HTTPError
except (HTTPError) as e:
    returnError(e)


person jhoneyfield    schedule 18.02.2021    source источник


Ответы (2)


error == HTTPError не работает, потому что вы пытаетесь сравнить класс с экземпляром указанного класса.

Чтобы проверить, является ли error HTTPError, выполните isinstance(error, HTTPError).

person SuperStormer    schedule 18.02.2021
comment
Это было то, что мне было нужно. Спасибо! - person jhoneyfield; 19.02.2021

Это связано с тем, что HTTPError является определением класса, а e на самом деле является экземпляром этого класса.

Аналогичный пример -

class Dog:
     def __init__(self):
         pass
type(Dog())
>> <class '__main__.Dog'>
type(Dog)
>> <class 'type'>
person Nishant Mittal    schedule 18.02.2021