在Python中使用Try / Except语句

时间:2015-12-19 19:48:13

标签: python

我的代码如下:

import mechanize 
import urlparse
import util 

url = "https://math.berkeley.edu/~strain/"
urls = [url]
visited = []
link_pdf = []
br = mechanize.Browser()
br.open(url)
while len(urls) > 0: 
    try:
        br.open(urls[0])
        urls.pop(0)
        for link in br.links(): 
           new_url = urlparse.urljoin(link.base_url, link.url)
           print new_url
           urls.append(new_url) 
    except: 
         print "error"

以下是它的运行方式: 在某些方面,它将是这样的:

https://math.berkeley.edu/~strain/Publications/tvm.pdf
error
https://math.berkeley.edu/~strain/Publications/vce.pdf
error
https://math.berkeley.edu/~strain/Publications/mclaughlin.strain.kdv.pdf
error
error
error
error
error
error 
....

我只想打印四次

它将运行并打印“错误”,直到某些点只会永远打印出错误。并且,我只希望它只打了四次我的脚本命中错误并打破它。 因此,任何人都可以告诉我该怎么做?谢谢。

编辑:我发布了永远导致错误的代码及其运行方式。

4 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您只想允许错误四次。

计算您遇到的错误数量,并在达到限制时让循环结束。

errors = 0
while len(urls) > 0 and errors < 4:
    try:
        #doing something 
    except:
        errors += 1
        print "error"

答案 1 :(得分:0)

我最好的猜测是在“try:”语句中你做了一些改变url变量长度的东西。当“try:”无法运行时,len(url)在循环的其余部分保持不变(假设你的意思是“while”而不是“why”)和“except:”是唯一仍在执行的部分。

在不知道其余代码的情况下,我无法提供太多帮助

编辑:您编辑了帖子,看起来我是正确的,当“尝试:”部分失败时,新网址永远不会分配新的网址,而进入无限循环时,它会永远打印“错误”。

答案 2 :(得分:0)

你可以像这样使用嵌套while循环的计数器:

while you_cond:
    tries = 0

    while tries < 4:
        try:
            pass  # do something
            break
        except Exception:
            print('error')
            tries += 1

此外,您可以在主while循环中使用这两个条件并省略第二个条件(在这种情况下行为会发生变化)。

答案 3 :(得分:0)

关于代码的问题是关于不变量,即:

len(urls) > 0

代码的try部分可能会稍微改变urls容器的长度。

如果您不希望在第一次失败后达到无限循环,则必须更改except部分上的容器,最好删除导致错误的项目。

我简短的说法:就目前而言,len(urls)在第一次错误后永远不会改变。

然后,作为Python程序员,您应该知道最好捕获您可能期望的特定异常,并让其他异常通过,因为通过的异常将指向错误(错误在你的解决方案中)。