Python 隐藏错误
好的,我对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 个回答
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。所以如果你知道只有几个可能的错误,最好只捕捉这些错误,并明确处理它们。