如何在Python中处理except子句引发的异常?

如何在Python中处理except子句引发的异常?

在Python中,异常处理是一个非常重要的概念。当某些错误发生时,通常会抛出一个异常,如果不加处理,程序会直接崩溃。所以,在编写Python代码时,必须考虑到可能出现的异常情况,并通过合适的异常处理机制来处理这些异常。

Python中的异常处理机制主要是通过try/except语句来实现的。在try块中编写可能出现异常的代码,当异常发生时,try块中的程序会被中断执行,转而执行对应的except块中的程序。在except块中,可以编写处理异常的代码,也可以将异常重新抛出,让上层代码来处理。下面来看一下try/except语句的基本结构和用法。

更多Python文章,请阅读:Python 教程

基本结构和用法

try:
    # 可能出现异常的代码
except 异常类型1:
    # 处理异常1的代码
except 异常类型2:
    # 处理异常2的代码
else:
    # 没有异常发生时执行的代码
finally:
    # 不管有没有异常都会执行的代码

在使用try/except语句时,有几点需要注意:

  1. try语句后面必须紧跟except语句,否则会出现语法错误;
  2. 当多个except语句同时匹配到同一个异常时,只有最前面的一个except块会被执行;
  3. 可以使用一个except块来捕获多个异常类型;
  4. try语句也可以搭配else和finally子句来使用,else块的代码会在try块中没有发生异常时执行,finally块的代码则会在try和except块中的程序执行完毕后一定会被执行。

下面来看一个具体的例子,我们可以看到,在try块中,尝试打开一个不存在的文件时,Python会抛出FileNotFoundError异常,然后执行对应的except块中的程序。

try:
    f = open('not_exist.txt', 'r')
except FileNotFoundError:
    print('文件不存在!')

执行结果:

文件不存在!

除了直接使用具体的异常类型之外,我们还可以使用Exception作为通用的异常类型,来捕获所有没有特别声明的异常。例如,下面的代码演示了如何捕获所有的异常,并打印出异常的详细信息。

try:
    # 可能出现异常的代码
except Exception as e:
    # 处理异常的代码
    print('出现异常:{}'.format(e))

上面的代码中,except语句中的e变量表示捕获到的异常,可以通过这个变量来获取异常的详细信息。

常见的异常类型

在Python中,有很多内置的异常类型,常见的有以下几种。

  • AttributeError:处理对象没有一个属性引发的异常。
  • IndexError:处理Index超出序列范围引发的异常。
  • KeyError:处理一个映射中键不存在引发的异常。
  • NameError:处理不存在的标识符引发的异常。
  • ValueError:处理传递给函数的参数无效或不恰当引发的异常。

下面分别针对每种常见的异常类型进行简单的示例演示。

AttributeError
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person('Jack', 25)
print(p.gender)

执行结果:

AttributeError: 'Person' object has no attribute 'gender'

上面的代码中,尝试访问Person类实例的gender属性,但是这个属性并不存在,所以Python会抛出AttributeError异常。

IndexError
arr = [1, 2,3]
print(arr[3])

执行结果:

IndexError: list index out of range

上面的代码中,尝试访问数组arr中的第4个元素,但由于数组长度只有3,超出了序列范围,所以Python会抛出IndexError异常。

KeyError
dic = {'name': 'Jack', 'age': 25}
print(dic['gender'])

执行结果:

KeyError: 'gender'

上面的代码中,尝试访问字典dic中不存在的键’gender’,所以Python会抛出KeyError异常。

NameError
print(x)

执行结果:

NameError: name 'x' is not defined

上面的代码中,尝试访问一个不存在的变量x,所以Python会抛出NameError异常。

ValueError
int('abc')

执行结果:

ValueError: invalid literal for int() with base 10: 'abc'

上面的代码中,将一个非数字字符串’abc’传递给int函数,所以Python会抛出ValueError异常。

如何处理多个异常

除了以上常见的异常类型外,还有其他许多可能会出现的异常类型,需要根据具体情况进行处理。当然,一个完善的异常处理机制需要考虑到所有可能的异常情况,并对这些异常情况进行合适的处理。下面介绍几种常见的处理多个异常的方法。

捕获多个异常

在一个except块中,可以同时捕获多个异常类型,以逗号分隔。例如,下面的代码演示了如何同时处理IndexError和ValueError异常。

try:
    int('abc'[4])
except (IndexError, ValueError):
    print('发生了IndexError或ValueError异常!')

执行结果:

发生了IndexError或ValueError异常!
捕获所有异常

如果不想处理特定的异常类型,可以使用通用的Exception异常类型来捕获所有未处理的异常。例如,下面的代码演示了如何使用通用的Exception来捕获所有异常。

try:
    # 可能出现异常的代码
except Exception as e:
    # 处理所有异常的代码
    print('发生了异常:{}'.format(e))
捕获未知异常

有时候,在编写程序时,无法预料到所有可能出现的异常类型。此时,可以使用except语句中不带异常类型的形式来捕获所有未知异常。但是在实际使用时,应该慎用该方法,因为这样会捕获所有的异常,包括程序中的逻辑错误。例如,下面的代码演示了如何捕获所有未知异常。

try:
    # 可能出现异常的代码
except:
    # 处理未知异常的代码
    print('发生了未知异常!')

如何重新抛出异常

有时候,需要在异常处理过程中,将异常重新抛出,交给上层代码来处理。例如,针对读取文件时可能出现的IOError异常,我们可以在处理这个异常后,将异常重新抛出,让上层代码来处理。

try:
    with open('file.txt', 'r') as f:
        f.read()
except IOError:
    print('文件不存在!')
    raise

上面的代码中,如果打开文件失败,程序会抛出IOError异常;然后在except块中,处理了这个异常,并打印出相应的提示信息。最后,通过raise语句将异常重新抛出,交给上层代码来处理。

结论

在Python中,处理except子句引发的异常是一个非常重要的概念。在编写程序时,应该考虑到所有可能出现的异常情况,并通过try/except语句来处理这些异常。在处理异常时,可以捕获特定的异常类型,也可以捕获所有异常,并根据具体情况进行处理。除此之外,还可以将异常重新抛出,交给上层代码来处理。

在日常编写Python程序时,需要注意异常处理机制的正确使用,尽可能地避免程序意外崩溃的情况发生。同时,也需要考虑异常处理代码的可读性和可维护性,尽可能地使异常处理代码简洁、清晰易懂。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程