版本无关代码中的异常处理

时间:2018-05-16 02:06:11

标签: python python-3.x python-2.7 exception-handling

我手头有一个简单的任务...处理异常,因此在python2.x / 3.x之间使用urllib / urllib2时,代码不会抛出IncompleteRead

for python2

try:
    page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead, e:
    page = e.partial

for python3

try:
    page = request.urlopen(urls).read()
except (http.client.IncompleteRead) as e:
    page = e.partial

现在因为模块本身不同,如何尝试 - 除非我不知道我的用户将运行哪个python版本?

我不能在我的尝试中检查python版本 - 除了......或者我可以吗?

有没有办法捕获它的超级类,所以它对于两个python版本都变得相同?如果有,怎么样?

3 个答案:

答案 0 :(得分:2)

你可以:

try:
    from httplib import IncompleteRead
    import urllib2 as httpclient
except ImportError:
    from http.client import IncompleteRead
    import request as httpclient

然后使用:

try:
    page = httpclient.urlopen(urls).read()
except IncompleteRead as e:
    page = e.partial

在python2和python3中。

答案 1 :(得分:1)

除非你需要Python 2.5,否则你可以在2.x。

中使用new-style except:statements

因此,唯一的区别是模块名称。您可以手动try Sraw's answer。但您可能应该使用sixfuturizemodernize作为the official porting docs和大多数其他双版本和移植指南推荐,这正是这种事情他们有利于他们。

使用six.moves

from six.moves import http_client
from six.moves import urllib_request

try:
    page = urllib_request.urlopen(urls).read()
except http_client.IncompleteRead as e:
    page = e.partial

或者future

from future import standard_library
standard_library.install_aliases()
import http.client
import urllib.request, urllib.error, urllib.parse

try:
    page = urllib.request.urlopen(urls).read()
except http.client.IncompleteRead as e:
    page = e.partial

或者,更好的是,只需编写2.7代码:

import httplib
import urllib2

try:
    page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead as e:
    page = e.partial

...然后在其上运行futurize,它会自动为您提供上面的future代码。

答案 2 :(得分:0)

您可以尝试...除了在 init 模块中导入,然后将您的代码拆分为python2和python3模块:

try:
    import urllib2
    pyver2()
except ModuleNotFoundError:
    import requests
    pyver3()

哦请求没有做你想要的,也许你的意思是'请求'和请求没有'urlopen'方法你需要使用'get()'。