Python 隐藏错误

0 投票
1 回答
14590 浏览
提问于 2025-04-17 16:57

好的,我对Python还比较陌生,现在我正在做一个控制台程序,这个程序会有很多功能,其中一个功能是获取网页的源代码,然后要么直接在页面上打印出来,要么如果用户提供了另一个参数,就把源代码保存到那个参数指定的文件里。第一个参数就是要获取源代码的网站网址。

我引入的库是:

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 = ""

那么它总是会显示“无法连接...”。

有人能帮忙吗?我没有把我的其他代码放上来,因为我觉得没什么用,如果你需要的话我可以把全部代码都发上来。

我之所以把这个标题定为“隐藏错误”,是因为它在某种程度上还是能工作的,只是会显示无法连接的提示。如果用户输入第二个参数,那么它会把源代码保存到用户指定的文件里。

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.')

另一种方法是直接捕捉 任何 错误,不指定具体的错误类型(这就是你在最后的代码中所做的)。不过要注意,这种做法通常不推荐,因为它会隐藏你可能没预料到的错误,也就是会掩盖一些bug。所以如果你知道只有几个可能的错误,最好只捕捉这些错误,并明确处理它们。

撰写回答