Защо повдигнатото изключение в блок try/except не е равно на HTTPError в метод при сравнение?

  • Цел: предаване на изключение от блок за опит освен към метод за дефиниране на персонализиран изход към потребителя въз основа на типа грешка, без да се използва requests.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