Python中的异常是什么?

Python中的异常是什么?,python,Python,我已经读了三本初级Python书籍,但是我仍然不理解异常 有人能给我一个高层次的解释和/或为我指出一个好的指导方向吗 我想我知道异常是代码或流程中导致代码停止工作的错误 最好从Python开始,因为您将看到的大多数都是从Python派生的 请记住,任何人都可以在任何事情上抛出他们想要的任何错误,然后抓住它并将其消除。下面是一个快速代码段,它使用异常来处理,而不是if/else,其中\uu get\u site\u file()在任何路径列表中都找不到文件时抛出异常。尽管有这个特殊的例外,代码仍然

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

有人能给我一个高层次的解释和/或为我指出一个好的指导方向吗


我想我知道异常是代码或流程中导致代码停止工作的错误

最好从Python开始,因为您将看到的大多数都是从Python派生的

请记住,任何人都可以在任何事情上抛出他们想要的任何错误,然后抓住它并将其消除。下面是一个快速代码段,它使用异常来处理,而不是if/else,其中
\uu get\u site\u 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()             

最好从Python开始,因为您将看到的大多数都是从Python派生的

请记住,任何人都可以在任何事情上抛出他们想要的任何错误,然后抓住它并将其消除。下面是一个快速代码段,它使用异常来处理,而不是if/else,其中
\uu get\u site\u 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()             

例外不一定是错误。当代码遇到它(立即)不知道如何处理的事情时,它们会被提出。这可能是完全可以接受的,这取决于您如何编写代码。例如,假设您要求用户输入一个数字。然后尝试获取该文本(字符串)并将其转换为数字(int)。但是,如果用户输入,比如说,“cat”,这将引发一个异常。但是,您可以让您的代码处理该异常,而不是中断,只需给用户一条小消息,要求他重试,并请使用一个数字。请查看此链接以了解我所说的内容: 此外,通常使用try、except(或catch)块处理异常。例如:

try:
    integer = int(raw_input("Please enter an integer: "))
except Exception, exc:
    print "An error has occured."
    print str(exc)

希望有帮助

异常不一定是错误。当代码遇到它(立即)不知道如何处理的事情时,它们会被提出。这可能是完全可以接受的,这取决于您如何编写代码。例如,假设您要求用户输入一个数字。然后尝试获取该文本(字符串)并将其转换为数字(int)。但是,如果用户输入,比如说,“cat”,这将引发一个异常。但是,您可以让您的代码处理该异常,而不是中断,只需给用户一条小消息,要求他重试,并请使用一个数字。请查看此链接以了解我所说的内容: 此外,通常使用try、except(或catch)块处理异常。例如:

try:
    integer = int(raw_input("Please enter an integer: "))
except Exception, exc:
    print "An error has occured."
    print str(exc)

希望有帮助

在过去,当人们用汇编语言或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)
一旦您了解了异常试图实现的基本思想,就会有很多有用的信息

如果你想了解更多的背景知识,可以提供帮助(尽管在你理解基本概念之前,这篇文章不是很有用)


如果你仍然不明白,可以问一个更具体的问题。

在过去,当人们用汇编语言或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文档:

为了获得更高层次的解释,假设我们想要划分
varA/varB
。我们知道
varB
不能等于0,但我们可能不希望每次除法时都执行检查:

if varB != 0:
  varA / varB
我们可以使用异常来尝试块而不首先执行条件,然后根据
try
块中是否出现错误来处理程序的行为。在以下代码中,如果
varB==0
,则会将“oops”打印到控制台:

try:
  varA / varB
except ZeroDivisionError:
  print 'oops'
以下是可以使用的例外情况列表:

但是,如果您知道它是如何失败的,您可以打开一个python控制台,查看引发了什么异常:

>>> 1 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>1/0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ZeroDivisionError:整数除法或模零除法
Python文档: