python缩短嵌入式try-except块

时间:2014-08-15 05:32:18

标签: python python-requests try-except

当我尝试打开一个可能缺少'http://'标题的网址时,我一直在另一个try-except内使用try-except

但代码看起来很混乱。我想知道python是否有更好的方法来处理这些需求。实际上我已经阅读了'with'关键字..我觉得这会让代码更难以阅读......

我有打开的链接,但链接可能有些缺失。例如,网址就像。 xxx.com或http:/ / xxx。 COM。我必须测试 http://和url,http:// plus www。加上网址,网址 找到合适的人。

如果没有,我必须记录原因,然后继续下一个链接:

    for link in links:
        url = link
        if not url.startswith('http'):
            try:
                url1 = r'http://'+link
                res = requests.get(url)
            except Exception as e:
                try:
                    url2 = r'http://www.'+link
                    res = requests.get(url)
                except Exception as err:
                    self.print_error(*[url1, modify(e.message)])
                    self.print_error(*[url2, modify(err.message)])
                    self.error_log(*[url1, modify(e.message)])
                    self.error_log(*[url2, modify(err.message)])

        else:
            try:
                res = request.get(url)
            except Exception as e:
                self.print_error(*[url, modify(e.message)])
                self.error_log(*[url, modify(e.message)])

3 个答案:

答案 0 :(得分:7)

首先按优先顺序汇总潜在网址列表:

potential_urls = [link, 'http://' + link, 'http://www.' + link]

还要列出您遇到的错误列表:

errors_encountered = []

然后浏览列表,break如果有效。

res = None
for url in potential_urls:
    try:
        res = requests.get(url)
    except Exception as err:
        errors_encountered.append(err)
    else:
        break

如果所有尝试均无效,我们会将res设置为None,我们可以根据需要检测并记录:

if res is None:
    for url, err in zip(potential_urls, errors_encountered):
        self.print_error(url, modify(err.message))
    for url, err in zip(potential_urls, errors_encountered):
        self.error_log(url, modify(err.message))

否则,它成功了,您可以像往常一样使用res

答案 1 :(得分:0)

这是另一种可能性,它通过在成功时继续循环来简化嵌套。

for link in links:
    url = link
    if not url.startswith('http'):
        try:
            url1 = r'http://'+link
            res = requests.get(url)
            continue # we succeeded
        except Exception as e:
            pass

        try:
            url2 = r'http://www.'+link
            res = requests.get(url)
        except Exception as err:
            self.print_error(*[url1, modify(e.message)])
            self.print_error(*[url2, modify(err.message)])
            self.error_log(*[url1, modify(e.message)])
            self.error_log(*[url2, modify(err.message)])

答案 2 :(得分:0)

与@ icktoofay的答案类似,但从视角开始,如果链接成功与否,您可能只需要工作。

定义一个执行可能尝试的函数,并返回一个请求对象,或在尝试所有可能性之后,引发一个异常。

def try_get(link):
    for url in (link, 'http://' + link, 'http://www.' + link):
        try:
            return requests.get(url)
        except Exception:
            pass
    raise ValueError('no url was suitable', link)

然后遍历您的网址,并使用res或执行适合例外的操作。

for url in list_of_urls:
    try:
        res = try_get(url)
    except ValueError as e:
        print e