在Python中使用Try/Except语句

在Python中使用Try/Except语句,python,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.p

我的代码如下:

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 
....
我只想把它打印四次

它将运行并打印“错误”,直到某些点它将永远只打印出错误。而且,我只希望它只命中我的脚本命中错误四次,并打破它。 因此,有人能告诉我怎么做吗?多谢各位


编辑:我发布了导致错误的代码以及它的运行方式

如果我正确理解了您的问题,您希望只允许出现四次错误

计算您所犯错误的数量,并在达到极限时结束循环

errors = 0
while len(urls) > 0 and errors < 4:
    try:
        #doing something 
    except:
        errors += 1
        print "error"
错误=0
当len(url)>0且错误<4时:
尝试:
#做某事
除:
错误+=1
打印“错误”
我最好的猜测是在“try:”语句中,您执行了一些更改url变量长度的操作。当“try:”无法运行时,len(url)在循环的其余部分保持不变(假设您指的是“while”而不是“why”),并且“except:”是唯一仍在执行的部分

如果不知道代码的其余部分,我无法提供太多帮助


编辑:您编辑了您的帖子,我似乎是对的,当“尝试:”部分失败时,新url永远无法分配新url,而while进入无限循环,在该循环中永远打印“错误”。

您可以使用带有嵌套while循环的计数器,如下所示:

while you_cond:
    tries = 0

    while tries < 4:
        try:
            pass  # do something
            break
        except Exception:
            print('error')
            tries += 1
在您进行以下操作时:
尝试=0
当尝试<4时:
尝试:
通过,做点什么
打破
除例外情况外:
打印('错误')
尝试次数+=1

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

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

len(urls) > 0
代码的
try
部分可能会稍微改变URL容器的长度

如果您不想在第一次失败后到达无限循环,则必须在
部分(除
部分外)中更改容器,最好删除导致错误的项

简而言之,
len(url)
在出现第一个错误后永远不会改变


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

只需使用计数器,将其递增,当它等于4时,中断循环。请发布代码的相关部分。抱歉,我的意思是说,哦,我只是做了。它是一种网络爬虫,在某些情况下,它会永远击中errorr。我尝试过你的方法,但每当它击中错误时,它就会累加,并且永远不会触及错误运行的点。我的观点是,我希望错误永远运行,但只运行4次,它将打破循环。我不知道你想要什么。@Alexander那么你做错了什么。发布你的完整代码,错误不在发布的一个。首先你想如何破解错误?静音还是提高?也许我误解了你。无论何时,它都会打印错误。。。。我只希望它在某些时候只引发四次错误,它将永远引发错误,我只希望它引发四次,然后停止脚本。上面的代码应该这样做。更新了示例,其行为与您的相同:和输出屏幕截图: