0

好吧,我对 python 还很陌生,我正在制作一个控制台女巫,它将允许多种功能,其中之一是获取页面源并将其打印在页面上,或者如果他们有另一个 arg 则命名该 arg 的文件...第一个参数将是从中获取源的网站 url。

我的进口是:

import os, urllib.request

这是我的代码:

def grab(command, args, argslist):
    if args == "":
        print("The " + command + " command wan't used correctly type help " + command + " for help...")
    if args != "":
        print("This may take a second...")
        try:
            argslistcheck = argslist[0]
            if argslistcheck[0:7] != "http://":
                argslist[0] = "http://" + argslist[0]
            with urllib.request.urlopen(argslist[0]) as url:
                source = url.read()
                source = str(source, "utf-8")
        except IndexError:
            print("Couln't connect")
            source = ""
        try:
            filesourcename = argslist[1] + ".txt"
            filesourceopen = open(filesourcename, "w")
            filesourceopen.write(source)
            filesourceopen.close()
            print("You can find the file save in " + os.getcwd() + " named " + argslist[1] + ".txt.")
        except IndexError:
            print(source)

现在,虽然我现在可以改进我的代码,但我专注于要点。现在它可以工作了,我稍后会改进代码,唯一的问题是如果用户输入一个假网站或一个不存在的网站页面,那么它会返回很多错误。然而,如果我改变:

except IndexError:
    print("Coulnd't connect")
    source = ""

只是:

except:
    print("Couldn't connect")
    source = ""

然后总是说无法连接...

有什么帮助吗?我没有放其余代码,因为我认为它没有用,如果您需要它,我可以全部放上。

我命名这个隐藏错误的原因是因为它仍然可以工作,它只是说它无法连接,如果用户键入第二个参数,那么它会将源代码保存到他命名的文件中。

4

1 回答 1

1
try:
    argslistcheck = argslist[0]
    if argslistcheck[0:4] != "http://":
        argslist[0] = "http://" + argslist[0]
    with urllib.request.urlopen(argslist[0]) as url:
        source = url.read()
        source = str(source, "utf-8")
except IndexError:
    print("Couln't connect")
    source = ""

在该代码块中,唯一可以引发IndexError异常的是argslist[0]. 如果该列表中没有元素,则会发生这种情况。这很可能不是您的问题。

现在如果输入了无效的地址,urlopen将会失败。但它不会提出一个IndexError,而是一个urllib.error.URLError或更专业的urllib.error.HTTPError

如果你只是写except IndexError,你只会捕捉到那个错误,但不会捕捉到urlopen. 如果你也想抓住这些,你必须添加另一个except案例:

except IndexError:
    print('Argument is missing')
except urllib.error.URLError:
    print('Could not connect to the URL.')

另一种方法是通过不指定任何异常来捕获任何异常(这是您在上一个代码中所做的)。请注意,通常不建议这样做,因为它会隐藏您可能不会发生的任何异常;即它将隐藏错误。因此,如果您知道只有少数可能的异常,只需捕获并明确处理它们。

于 2013-02-24T19:53:27.490 回答