IMDbPy:如何捕获 IMDbDataAccessError?
IMDbPy : How can I catch IMDbDataAccessError?
我完全不擅长处理异常,而且我一直在学习使用 IMDbPy。
如果用户输入无效 ID,我想捕获异常。我试过了
import imdb
from imdb import IMDbDataAccessError
ia = imdb.IMDb(accessSystem='http')
try:
movie = ia.get_movie('12121212212121')
except IMDbDataAccessError:
print("error")
但它不打印文本 "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: {}
引发的异常属于 IOError 类型,它是 Python built-in exceptions 类型之一,您只捕捉到 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)
import imdb
from imdb import IMDbDataAccessError
try:
ia = imdb.IMDb(accessSystem='http', reraiseExceptions=True)
movie = ia.get_movie('12121212212121')
except:
print("error")
reraiseExceptions 的选项有帮助。现在程序输出跟踪 AND 之后 error
。 请注意,自 2021 年 5 月起,reraiseExceptions=True
应该已经是默认值。
我通过查看引发异常的函数的源代码发现了这一点。即 retrieve_unicode
和 update
。搜索 "ret = method(mopID)"
我发现 this 仅当 self._reraise_exceptions
在 IMDB Base 对象中设置为 true 时才会再次引发异常。
我创建了一个 issue 要求他们更清楚地表明此设置是必要的。创建者回复:
I think it would be better to just always raise the exception.
I'll consider the change for a future release.
另外值得注意的是他们 config 的摘录:
## Set the threshold for logging messages.
# Can be one of "debug", "info", "warning", "error", "critical" (default:
# "warning").
#loggingLevel = debug
这意味着您可以减少日志的冗长程度。但是,传递 loggingLevel="critical"
参数似乎并没有减少控制台输出。那是因为这些错误本身就是critical
.
级别的
但是,您可以 disable the logger completely:
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")
记录器的名称是 currently 'imdbpy'
和 'imdbpy.aux'
。
2021 年 5 月更新
在 github 问题上有一些 activity:
Just committed a change to the default behavior: now if not specified reraiseExceptions is True.
This means that any exception is re-raised.
If this breaks something important let us know, but I think this should be better handled catching the exception in the caller code.
我完全不擅长处理异常,而且我一直在学习使用 IMDbPy。 如果用户输入无效 ID,我想捕获异常。我试过了
import imdb
from imdb import IMDbDataAccessError
ia = imdb.IMDb(accessSystem='http')
try:
movie = ia.get_movie('12121212212121')
except IMDbDataAccessError:
print("error")
但它不打印文本 "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: {}
引发的异常属于 IOError 类型,它是 Python built-in exceptions 类型之一,您只捕捉到 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)
import imdb
from imdb import IMDbDataAccessError
try:
ia = imdb.IMDb(accessSystem='http', reraiseExceptions=True)
movie = ia.get_movie('12121212212121')
except:
print("error")
reraiseExceptions 的选项有帮助。现在程序输出跟踪 AND 之后 error
。 请注意,自 2021 年 5 月起,reraiseExceptions=True
应该已经是默认值。
我通过查看引发异常的函数的源代码发现了这一点。即 retrieve_unicode
和 update
。搜索 "ret = method(mopID)"
我发现 this 仅当 self._reraise_exceptions
在 IMDB Base 对象中设置为 true 时才会再次引发异常。
我创建了一个 issue 要求他们更清楚地表明此设置是必要的。创建者回复:
I think it would be better to just always raise the exception.
I'll consider the change for a future release.
另外值得注意的是他们 config 的摘录:
## Set the threshold for logging messages.
# Can be one of "debug", "info", "warning", "error", "critical" (default:
# "warning").
#loggingLevel = debug
这意味着您可以减少日志的冗长程度。但是,传递 loggingLevel="critical"
参数似乎并没有减少控制台输出。那是因为这些错误本身就是critical
.
级别的
但是,您可以 disable the logger completely:
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")
记录器的名称是 currently 'imdbpy'
和 'imdbpy.aux'
。
2021 年 5 月更新
在 github 问题上有一些 activity:
Just committed a change to the default behavior: now if not specified reraiseExceptions is True.
This means that any exception is re-raised.
If this breaks something important let us know, but I think this should be better handled catching the exception in the caller code.