3

我完全不擅长处理异常,而且我一直在学习使用 IMDbPy。如果用户输入了无效的 ID,我想捕获异常。我试过了

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: {}
4

2 回答 2

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

reraiseExceptions的选项会有所帮助。现在程序输出跟踪和之后error请注意,自 2021 年 5 月以来reraiseExceptions=True应该已经是默认设置。


我通过查看引发异常的函数的来源发现了这一点。即retrieve_unicodeupdate。搜索"ret = method(mopID)"我发现只有self._reraise_exceptions在 IMDB Base 对象中设置为 true 时才会再次引发异常。

我创建了一个问题,要求他们更清楚地表明此设置是必要的。创作者回复:

我认为总是提出例外会更好。
我会考虑对未来版本的更改。


另外值得注意的是他们的配置摘录:

## 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'


2021 年 5 月更新

github问题上有一些活动:

刚刚提交了对默认行为的更改:现在如果未指定 reraiseExceptions 为 True。

这意味着重新引发任何异常。

如果这破坏了一些重要的事情,请告诉我们,但我认为应该更好地处理在调用者代码中捕获异常。

于 2019-09-26T21:39:59.527 回答
0

引发的异常是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)
于 2019-09-26T21:08:11.863 回答