我已经阅读了三本初级Python书籍,但是,我仍然不理解异常。
有人可以给我一个高级别的解释和/或指出我正确的方向为他们提供一个好的教程吗?
我想我明白,异常是导致代码停止工作的代码或进程中的错误。
答案 0 :(得分:3)
在过去,当人们使用汇编语言或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无法打开文件,或者将该行转换为整数,则会引发异常,这将自动关闭文件,退出函数,退出整个程序,打印出有用的调试信息。< / p>
在某些情况下,您希望处理异常而不是让它退出程序。例如,您可能希望打印错误消息,然后询问用户不同的文件名:
while True:
path = input("Give me a path")
try:
print(countlines(path))
break
except Exception as e:
print("That one didn't work:", e)
一旦你知道异常试图完成的基本想法,the tutorial就会有很多有用的信息。
如果你想要更多背景,Wikipedia可以提供帮助(虽然在你理解基本想法之前这篇文章不是很有用)。
如果您仍然不明白,请提出更具体的问题。
答案 1 :(得分:1)
开始的最佳位置是Python的list of built-in exceptions,因为大多数人都会从中得到。
请记住,任何人都可以抛出他们想要的任何错误,然后抓住它并解雇它。这是一个使用异常处理而不是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()
答案 2 :(得分:1)
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
答案 3 :(得分:-1)
例外不一定是错误。当代码遇到(立即)知道如何处理的事情时,它们会被引发。这可能完全可以接受,具体取决于您编写代码的方式。例如,假设您要求用户输入一个数字。然后尝试获取该文本(字符串)并将其转换为数字(int)。但是,如果用户输入“cat”,则会引发异常。然而,您可以让您的代码处理该异常,而不是中断,只是给用户一个小消息,要求他再试一次,请使用一个数字。看看这个链接,看看我在说什么:http://www.tutorialspoint.com/python/python_exceptions.htm 此外,您通常使用try(除了(或catch)块)来处理异常。例如:
try:
integer = int(raw_input("Please enter an integer: "))
except Exception, exc:
print "An error has occured."
print str(exc)
希望它有所帮助!