IMDbPy: Как я могу поймать IMDbDataAccessError? - PullRequest
2 голосов
/ 26 сентября 2019

Я совершенно нуб в обработке исключений, и я учусь работать с IMDbPy.Я хотел поймать исключение, если пользователь вводит неверный идентификатор.Я попытался

import imdb
from imdb import IMDbDataAccessError
ia = imdb.IMDb(accessSystem='http')
try:
    movie = ia.get_movie('12121212212121')
except IMDbDataAccessError:
    print("error")

Но он не печатает текст "ошибка", а показывает сообщение об ошибке.Который -

IMDbDataAccessError exception raised; args: ({'errcode': None,
'errmsg': 'None', 'url':
'https://www.imdb.com/title/tt12121212212121/reference', 'proxy': '',
'exception type': 'IOError', 'original exception': <HTTPError 404:
'Not Found'>},); kwds: {}

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019
import imdb
from imdb import IMDbDataAccessError
try:
    ia = imdb.IMDb(accessSystem='http', reraiseExceptions=True)
    movie = ia.get_movie('12121212212121')
except:
    print("error")

Помогает опция reraiseExceptions .Теперь программа выводит след И потом error.


Я нашел это, посмотрев на источник функций, вызвавших Исключение.то есть retrieve_unicode и update.В поисках "ret = method(mopID)" я обнаружил this , который снова вызывает исключение, только если self._reraise_exceptions установлен в true в базовом объекте IMDB.

Я создал проблему попросить их сделать это более очевидным, что этот параметр необходим


Также стоит отметить, что этот отрывок из их config :

## Set the threshold for logging messages.
# Can be one of "debug", "info", "warning", "error", "critical" (default:
# "warning").
#loggingLevel = debug

, который подразумевает, чтоВы можете уменьшить многословие журналов.Однако передача параметра loggingLevel="critical", по-видимому, не уменьшает вывод консоли.Это связано с тем, что эти ошибки сами по себе имеют уровень critical.
Однако вы можете полностью отключить регистратор :

import imdb
from imdb import IMDbDataAccessError
import logging
try:
    logger = logging.getLogger('imdbpy');
    logger.disabled = True
    ia = imdb.IMDb(accessSystem='http', reraiseExceptions=True, loggingLevel="critical")
    movie = ia.get_movie('12121212212121')
except IMDbDataAccessError:
    print("error")

Имена регистраторов: в настоящее время 'imdbpy' и 'imdbpy.aux'.

0 голосов
/ 27 сентября 2019

Возбужденное исключение имеет тип IOError , который является одним из встроенных исключений Python , и вы только перехватываете IMDbDataAccessError, который не является родителем IOError.

Вы можете поймать их отдельно (например, с помощью ZeroDivisionError вместо IOError), например:

try:
    1/0
except IMDbDataAccessError:
    print("problem in IMDbPY")
except ZeroDivisionError:
    print("division by zero error")

или просто перехватить что-нибудь;имейте в виду, что это считается плохой практикой, поскольку это может маскировать другие проблемы и затруднить отладку вашего кода, но в некоторых случаях это имеет смысл:

try:
    1/0
except Exception as e:
    print("ERROR: %s" % e)
...