Python 编程/错误
在 python 中有三种类型的错误;语法错误,逻辑错误 和 异常。
语法错误是最基本类型的错误。当 Python 解析器无法理解代码行时,就会出现语法错误。语法错误几乎总是致命的,也就是说几乎不可能成功执行包含语法错误的代码段。一些语法错误可以被捕获和处理,比如 eval(""),但这些很少见。
在 IDLE 中,它会突出显示语法错误所在的位置。大多数语法错误是拼写错误、缩进错误或参数错误。如果您遇到此错误,请尝试检查您的代码中是否存在这些问题。
这些是最难找到的错误类型,因为它们会给出不可预测的结果,并且可能使您的程序崩溃。如果您有逻辑错误,可能会发生很多不同的情况。但是,这些问题很容易修复,因为您可以使用调试器,它将运行程序并修复任何问题。
下面展示了一个简单的逻辑错误示例,while 循环将编译并运行,但是,循环永远不会结束,可能会使 Python 崩溃
#Counting Sheep
#Goal: Print number of sheep up until 101.
sheep_count=1
while sheep_count<100:
print("%i Sheep"%sheep_count)
逻辑错误只是从编程目标的角度来看是错误的;在许多情况下,Python 按照预期的方式工作,只是没有按照用户的预期方式工作。上面的 while 循环按照 Python 的预期方式正常运行,但用户需要的退出条件丢失了。
当 Python 解析器知道如何处理一段代码,但无法执行该操作时,就会出现异常。例如,尝试使用 Python 访问互联网,但没有互联网连接;Python 解释器知道如何处理该命令,但无法执行它。
与语法错误不同,异常并不总是致命的。异常可以使用try语句进行处理。
考虑以下代码来显示网站 'example.com' 的 HTML。当程序执行到达 try 语句时,它将尝试执行以下缩进的代码,如果由于某种原因出现错误(计算机未连接到互联网或其他原因),Python 解释器将跳到 'except:' 命令下面的缩进代码。
import urllib2
url = 'http://www.example.com'
try:
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
print(the_page)
except:
print("We have a problem.")
另一种处理错误的方法是捕获特定错误。
try:
age = int(raw_input("Enter your age: "))
print("You must be {0} years old.".format(age))
except ValueError:
print("Your age must be numeric.")
如果用户输入他的/她的年龄的数值,则输出应如下所示
Enter your age: 5 Your age must be 5 years old.
但是,如果用户输入的他的/她的年龄的非数值,则在尝试对非数值字符串执行ValueError方法时会抛出该方法,并且执行int()方法时会抛出该方法,并且执行except子句下的代码。
Enter your age: five Your age must be numeric.
您也可以使用try块,其中包含while循环来验证输入。
valid = False
while valid == False:
try:
age = int(raw_input("Enter your age: "))
valid = True # This statement will only execute if the above statement executes without error.
print("You must be {0} years old.".format(age))
except ValueError:
print("Your age must be numeric.")
该程序将提示您输入您的年龄,直到您输入有效的年龄。
Enter your age: five Your age must be numeric. Enter your age: abc10 Your age must be numeric. Enter your age: 15 You must be 15 years old.
在某些其他情况下,可能需要获取有关异常的更多信息并适当地处理它。在这种情况下,可以使用 except as 结构。
f=raw_input("enter the name of the file:")
l=raw_input("enter the name of the link:")
try:
os.symlink(f,l)
except OSError as e:
print("an error occurred linking %s to %s: %s\n error no %d"%(f,l,e.args[1],e.args[0]))
enter the name of the file:file1.txt enter the name of the link:AlreadyExists.txt an error occurred linking file1.txt to AlreadyExists.txt: File exists error no 17 enter the name of the file:file1.txt enter the name of the link:/Cant/Write/Here/file1.txt an error occurred linking file1.txt to /Cant/Write/Here/file1.txt: Permission denied error no 13