扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年1月17日
关键字:
管理用户输入
在任何时候,程序都是依赖于用户的输入工作。如果用户的输入有误,就会导致程序出错。大多数时候,如果程序出错的时候能够给出错误提示并且关闭程序,那么程序已经做得不错了。当然,程序可以进一步的完善,例如更正用户的输入,使得程序能继续运行。在下面的程序中,用户需要提供一个网址作为函数参数,所以我们将检查用户输入是否是一个合法的网址——这一程序是为Web站点开发,所以我们只接受使用HTTP协议的地址。我们将会编写函数来检查这一点,如果没有给出协议名称,就自动添加HTTP协议标准。完整的函数代码如下。接下来我们将详细分析这段代码,所以现在不理解也不要担心:
def parseAddress(input):
if input[:7] != "http://":
if input.find("://") != -1:
print "Error: Cannot retrieve URL, protocol must be HTTP"
sys.exit(1)
else:
input = "http://" + input
return input
首先,我们定义一个parseAddress函数,该函数需要一个参数,我们称之为input。下一步我们需要判断是否得到一个正确的地址,我们检查字符串的起始字符(要记得input[:7]返回输入字符串的一部分,从开始字符直到第七个字符)是否为“http://”。如果是,就没有问题。反之,程序就会出错。但是,如果只是没有指定网络协议,我们可以假定用户提供的是没有指定网络协议的http地址。我们可以使用字符串函数find来检查是否指定了协议。find函数可以对字符串和子字符串进行操作,返回值是最先匹配的字符串所在位置或者-1。-1代表没有找到匹配的字符串,例如:
>>> "hello world".find("hello")
0
>>> "hello world".find("wor")
6
>>> "hello world".find("word")
-1
让我们来测试这一函数(注意:如果你在解释器里执行这个函数,则需要导入sys文件,因为parseAddress函数中还调用了exit函数):
>>> parseAddress("http://www.builderau.com.au")
'http://www.builderau.com.au'
>>> parseAddress("www.builderau.com.au")
'http://www.builderau.com.au'
>>> parseAddress("ftp://builderau.com.au")
Error: Cannot retrieve URL, protocol must be HTTP
打开浏览HTTP站点
Python的标准库中含有许多模块,从而使得复杂的任务变得很简单。在下面的例子中,我们将要使用urllib2模块来完成打开web页面。使用urllib2模块打开和浏览web站点就如同打开文本文件一样简单:
import urllib2
website = urllib2.urlopen(address)
website_html = website.read()
和文件操作一样,你在访问网络站点的时候也会出错。可能是服务器关机了,也可能是你的Internet连接中断了,还有可能是你查询的文件不存在。不管是什么原因造成,你需要解决这些问题。在Python中正确处理这些问题的方法是使用异常。Urlopen函数能够抛出很多不同的例外,需要掌握的两个异常,一个是HTTPError,当抛出这个异常的时候,你所连接的服务器也同时返回一个错误代码。另一个要掌握异常是URLError,这个异常在其它网络或者协议发生错误时抛出。你可以通过下面的方法捕获异常:
try:
website = urllib2.urlopen(address)
except urllib2.HTTPError, e:
print "Cannot retrieve URL: HTTP Error Code", e.code
except urllib2.URLError, e:
print "Cannot retrieve URL: " + e.reason[1]
因此,当你尝试解析一个不存在的URL的时候,你将会看到类似下面的错误信息:
% python2.4 images.py www.google.com/doesnotexist
Cannot retrieve URL: HTTP Error Code 404
通过错误代码404,我们可能会获取更多的信息,因为我们已经遇到过很多次。但是你能够解释下面这些代码所代表的含义吗?例如,错误代码407表示需要指定代理服务器,错误代码503表示服务器正在超负荷运行,不能处理当前的请求。很明显,我们需要一种更友好的方式给用户反馈错误信息。同样,Python中也提供了这个功能。这是通过BaseHTTPServer模块中定义的字典来完成。字典是Python中的基本数据类型,在其它语言中也被称之为hash表或者map,我们以后将会详细介绍字典。现在我们就简单地将它认为是一个列表,只是它不仅能按照索引顺序返回条目,也可以按照指定的任意其它标示符按序返回。其中,字典BaseHTTPRequestHandler.responses提供了一个错误编码和解释之间的映射表——-如果你对这个映射表感兴趣,可以参照HTTP 1.1 规范 RFC,所以下面的代码:
import BaseHTTPServer
print BaseHTTPServer.BaseHTTPRequestHandler.responses[404]
产生如下的输出:
('Not Found', 'Nothing matches the given URI')
我们可以使用字典输出更详细的错误信息。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者