2

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

有人能给我一个高层次的解释吗?

我想我理解异常是导致代码停止工作的代码或过程中的错误。

4

5 回答 5

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 无法打开文件,或者将行转换为整数,它会引发异常,这会自动关闭文件,退出你的函数,并退出你的整个程序,打印出有用的调试信息。

在某些情况下,您希望处理异常而不是让它退出您的程序。例如,也许您想打印错误消息,然后向用户询问不同的文件名:

while True:
    path = input("Give me a path")
    try:
        print(countlines(path))
        break
    except Exception as e:
        print("That one didn't work:", e)

一旦你了解了异常试图完成的基本思想,本教程就会提供很多有用的信息。

如果您想了解更多背景知识,维基百科可以提供帮助(尽管在您了解基本思想之前,这篇文章并不是很有用)。

如果您仍然不明白,请提出更具体的问题。

于 2012-11-21T01:05:55.353 回答
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
于 2012-11-21T01:08:34.287 回答
1

最好的起点是 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()             
于 2012-11-21T00:59:41.007 回答
0

异常是程序执行过程中发生的意外事件。异常可能由 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 )
于 2021-08-30T08:22:07.273 回答
-1

异常不一定是错误。它们是当代码遇到它不(立即)知道如何处理的事情时引发的事情。这可能是完全可以接受的,具体取决于您如何编写代码。例如,假设您要求用户输入一个数字。然后,您尝试获取该文本(字符串)并将其转换为数字(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)

希望能帮助到你!

于 2012-11-21T01:02:36.990 回答