【问题标题】:How to handle exception in Python?如何在 Python 中处理异常?
【发布时间】:2021-03-02 16:22:12
【问题描述】:

我正在使用 Imdbpy 库从 IMDB 获取电影列表的详细信息。但是我无法处理生成的异常。

我哪里错了?

代码如下:

from imdb import IMDb
ia = IMDb()
from_id = 650
to_id = from_id +5
for  i in range(from_id,to_id):
    try:
        movie_id = ia.get_movie(i)
        title = movie_id['title']
        release_year  = movie_id['year']
        kind = movie_id['kind']
        movieid = movie_id.movieID
        print ("here", title,kind,movieid)
    except:
        pass

当出现异常时,我不想做任何事情。我希望它跳过它。 我什至试过except Exception as e。但这并没有帮助。它仍然抛出错误。

这是错误:

2019-03-21 15:00:24,230 CRITICAL [imdbpy] C:\Python36x64\lib\site-packages\imdb\_exceptions.py:34: IMDbDataAccessError exception raised; args: ({'errcode': None, 'errmsg': 'None', 'url': 'http://www.imdb.com/title/tt0000652/reference', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 404: 'Not Found'>},); kwds: {}
Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 231, in retrieve_unicode
    response = uopener.open(url)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 564, in error
    result = self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
2019-03-21 15:00:24,237 CRITICAL [imdbpy] C:\Python36x64\lib\site-packages\imdb\__init__.py:714: caught an exception retrieving or parsing "main" info set for mopID "0000652" (accessSystem: http)
Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 231, in retrieve_unicode
    response = uopener.open(url)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 564, in error
    result = self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\__init__.py", line 709, in update
    ret = method(mopID)
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 446, in get_movie_main
    cont = self._retrieve(self.urls['movie_main'] % movieID + 'reference')
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 406, in _retrieve
    ret = self.urlOpener.retrieve_unicode(url, size=size)
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 265, in retrieve_unicode
    'original exception': e}
imdb._exceptions.IMDbDataAccessError: {'errcode': None, 'errmsg': 'None', 'url': 'http://www.imdb.com/title/tt0000652/reference', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 404: 'Not Found'>}
2019-03-21 15:00:25,253 CRITICAL [imdbpy] C:\Python36x64\lib\site-packages\imdb\_exceptions.py:34: IMDbDataAccessError exception raised; args: ({'errcode': None, 'errmsg': 'None', 'url': 'http://www.imdb.com/title/tt0000652/plotsummary', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 404: 'Not Found'>},); kwds: {}
Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 231, in retrieve_unicode
    response = uopener.open(url)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 564, in error
    result = self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
2019-03-21 15:00:25,254 CRITICAL [imdbpy] C:\Python36x64\lib\site-packages\imdb\__init__.py:714: caught an exception retrieving or parsing "plot" info set for mopID "0000652" (accessSystem: http)
Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 231, in retrieve_unicode
    response = uopener.open(url)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 564, in error
    result = self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python36x64\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Python36x64\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python36x64\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Python36x64\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python36x64\lib\site-packages\imdb\__init__.py", line 709, in update
    ret = method(mopID)
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 454, in get_movie_plot
    cont = self._retrieve(self.urls['movie_main'] % movieID + 'plotsummary')
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 406, in _retrieve
    ret = self.urlOpener.retrieve_unicode(url, size=size)
  File "C:\Python36x64\lib\site-packages\imdb\parser\http\__init__.py", line 265, in retrieve_unicode
    'original exception': e}
imdb._exceptions.IMDbDataAccessError: {'errcode': None, 'errmsg': 'None', 'url': 'http://www.imdb.com/title/tt0000652/plotsummary', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 404: 'Not Found'>}

id = 652 出现错误。

【问题讨论】:

  • 请向我们展示您的代码。例外是urllib.error.HTTPError: HTTP Error 404: Not Found,因此很可能是由于网址中的拼写错误。
  • 我已经发布了整个代码。请参考问题的顶部。谢谢
  • 您是如何安装IMDb 库的?你确定它支持 Python3 吗?我可以在pypi 上看到它是 16 年前发布的。主页链接已失效。
  • 是的,它确实支持 Python3。我得到了剩余 ID 的正确输出。但是当我尝试忽略 id 652 的异常时,它仍然抛出错误。
  • 检查this out,听起来类似的错误。

标签: python python-3.x exception imdbpy


【解决方案1】:

其实你是在处理异常,你只是决定不做任何事情就处理它。

由于异常处理,您的代码继续执行,并且在错误中也有正确的行:

here The Boston Tea Party movie 0000650
here The Boy Detective, or The Abductors Foiled movie 0000651
here A Calamitous Elopement movie 0000653
here The Call of the Wild movie 0000654

如果您删除 try-catch,您的代码将在第一个错误时停止执行。

我认为打印错误是因为 imdbpy 中的某些命令打印在标准错误上。如果您想避免它们,您可以将标准错误重定向到 /dev/null 或文件,例如以这种方式启动您的脚本:

python3 my_imdb.py 2> /dev/null

【讨论】:

  • 谢谢。我在 Windows 上运行这个脚本。有什么办法可以抑制 Pycharm 中的这些错误?
  • 我不知道 pycharm,但我认为您也可以从 python 重定向错误。但是要小心,因为重定向也可能隐藏其他错误或不打印到标准输出。
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多