我已经阅读了三本 Python 入门级书籍,但是我仍然不了解异常。
有人能给我一个高层次的解释吗?
我想我理解异常是导致代码停止工作的代码或过程中的错误。
在过去,当人们用汇编语言或 C 语言编写时,每次调用可能失败的函数时,都必须检查它是否成功。所以你会有这样的代码:
def countlines(path):
f = open(path, 'r')
if not f:
print("Couldn't open", path)
return None
total = 0
for line in f:
value, success = int(line)
if not success:
print(line, "is not an integer")
f.close()
return None
total += value
f.close()
return total
异常背后的想法是您不必担心那些异常情况,您只需编写以下代码:
def countlines(path):
total = 0
with open(path, 'r') as f:
for line in f:
total += int(line)
return total
如果 Python 无法打开文件,或者将行转换为整数,它会引发异常,这会自动关闭文件,退出你的函数,并退出你的整个程序,打印出有用的调试信息。
在某些情况下,您希望处理异常而不是让它退出您的程序。例如,也许您想打印错误消息,然后向用户询问不同的文件名:
while True:
path = input("Give me a path")
try:
print(countlines(path))
break
except Exception as e:
print("That one didn't work:", e)
一旦你了解了异常试图完成的基本思想,本教程就会提供很多有用的信息。
如果您想了解更多背景知识,维基百科可以提供帮助(尽管在您了解基本思想之前,这篇文章并不是很有用)。
如果您仍然不明白,请提出更具体的问题。
Python 的文档:http ://docs.python.org/2/tutorial/errors.html
对于高级解释,假设我们要划分varA / varB
. 我们知道varB
不能等于 0,但我们可能不想在每次进行除法时都执行检查:
if varB != 0:
varA / varB
我们可以使用异常来尝试块而不先执行条件,然后根据try
块中是否出现问题来处理程序的行为。在以下代码中,如果varB == 0
,则 'oops' 将打印到控制台:
try:
varA / varB
except ZeroDivisionError:
print 'oops'
以下是可以使用的异常列表:http: //docs.python.org/2/library/exceptions.html#exceptions.BaseException
但是,如果您知道它是如何失败的,您可以打开一个 python 控制台并查看引发了什么异常:
>>> 1 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
最好的起点是 Python 的内置异常列表,因为您会看到大多数都源自于此。
请记住,任何人都可以在任何事情上抛出他们想要的任何错误,然后捕捉它并消除它。这是一个使用异常进行处理而不是 if/else 的快速片段,如果__get_site_file()
在任何路径列表中都找不到文件,则会引发异常。尽管有这个特殊的例外,代码仍然可以工作。但是,如果文件存在但权限不允许读取,代码会抛出未捕获的错误,该错误会停止执行。
def __setup_site_conf(self):
# Look for a site.conf in the site folder
try:
path = self.__get_site_file('site.conf')
self.__site_conf = open(path).read()
except EnvironmentError:
self.__site_conf = self.__get_site_conf_from_template()
异常是程序执行过程中发生的意外事件。异常可能由 alogical error
或a 引起unanticipated situation
。
在 Python 中,异常(也称为错误)是由遇到意外情况的代码引发(或抛出)的对象。
Python 解释器也可以在遇到意外情况时引发异常,例如内存不足。引发的错误可能会被以适当方式“处理”异常的周围上下文捕获。
如果未被捕获,异常会导致解释器停止执行程序并向控制台报告适当的消息。
def sqrt(x):
if not isinstance(x, (int, float)):
raise TypeError( x must be numeric )
elif x < 0:
raise ValueError( x cannot be negative )
异常不一定是错误。它们是当代码遇到它不(立即)知道如何处理的事情时引发的事情。这可能是完全可以接受的,具体取决于您如何编写代码。例如,假设您要求用户输入一个数字。然后,您尝试获取该文本(字符串)并将其转换为数字(int)。但是,如果用户输入“cat”,这将引发异常。但是,您可以让您的代码处理该异常,而不是中断,只需给用户一条小消息,要求他再试一次,并请使用一个数字。查看此链接以了解我在说什么:http ://www.tutorialspoint.com/python/python_exceptions.htm 此外,您通常使用 try, except(或 catch)块来处理异常。例子:
try:
integer = int(raw_input("Please enter an integer: "))
except Exception, exc:
print "An error has occured."
print str(exc)
希望能帮助到你!