跳转到内容

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
华夏公益教科书