Python中有哪些例外?

时间:2012-11-21 00:53:08

标签: python

我已经阅读了三本初级Python书籍,但是,我仍然不理解异常。

有人可以给我一个高级别的解释和/或指出我正确的方向为他们提供一个好的教程吗?

我想我明白,异常是导致代码停止工作的代码或进程中的错误。

4 个答案:

答案 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)

希望它有所帮助!