Python基础教程(Python 异常处理)

在 Python 中,异常处理是一种重要的编程机制,它能够帮助我们在程序运行时捕获并处理可能出现的错误,避免程序因意外情况而崩溃。以下是 Python 异常处理的详细介绍:

1. 异常的概念

在 Python 程序执行过程中,如果出现错误,就会引发异常。例如,当我们尝试对一个不存在的文件进行读取操作,或者进行除法运算时除数为零,都会触发相应的异常。Python 内置了许多不同类型的异常,每种异常都代表着不同的错误情况,如 ZeroDivisionError(除零错误)、FileNotFoundError(文件未找到错误)等。

2. try-except 语句

try-except 语句是 Python 中最基本的异常处理结构,它的作用是捕获并处理可能出现的异常。其基本语法如下:
 
try:
    # 可能会引发异常的代码块
    result = 1 / 0  # 这里会引发 ZeroDivisionError 异常
except ZeroDivisionError:
    # 当捕获到 ZeroDivisionError 异常时执行的代码
    print("除数不能为零!")

在上述代码中,try 块里包含了可能会引发异常的代码。如果在执行 try 块中的代码时发生了 ZeroDivisionError 异常,程序会立即跳转到对应的 except 块中执行相应的处理代码。

我们还可以使用多个 except 块来捕获不同类型的异常,示例如下:
try:
    num = int("abc")  # 这里会引发 ValueError 异常
    result = 1 / 0    # 如果上一行没有异常,这行也会引发 ZeroDivisionError 异常
except ValueError:
    print("输入的内容不能转换为整数!")
except ZeroDivisionError:
    print("除数不能为零!")

在这个例子中,try 块里有两个可能引发异常的操作。如果 int("abc") 引发了 ValueError 异常,程序会执行第一个 except 块中的代码;如果没有发生 ValueError 异常,而在执行 1 / 0 时引发了 ZeroDivisionError 异常,程序会执行第二个 except 块中的代码。

此外,还可以使用一个 except 块捕获多种异常,将异常类型放在一个元组中,示例如下:
try:
    num = int("abc")
    result = 1 / 0
except (ValueError, ZeroDivisionError):
    print("发生了值错误或除零错误!")

3. else 子句

try-except 语句还可以包含一个可选的 else 子句。如果 try 块中的代码没有引发任何异常,那么就会执行 else 块中的代码。示例如下:
try:
    num = int("123")
except ValueError:
    print("输入的内容不能转换为整数!")
else:
    print(f"转换后的整数是: {num}")

在这个例子中,由于 int("123") 可以正常转换为整数,没有引发 ValueError 异常,所以会执行 else 块中的代码。

4. finally 子句

finally 子句也是 try-except 语句的一个可选部分。无论 try 块中的代码是否引发异常,也不管异常是否被捕获并处理,finally 块中的代码都会被执行。通常,finally 块用于执行一些无论如何都需要完成的操作,如关闭文件、释放资源等。示例如下:

try:
    file = open("test.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("文件未找到!")
finally:
    if 'file' in locals():
        file.close()

在这个例子中,无论 try 块中打开文件和读取文件的操作是否成功,finally 块中的代码都会尝试关闭文件,确保资源被正确释放。

5. 抛出异常

在 Python 中,我们可以使用 raise 语句主动抛出异常。这在某些情况下非常有用,比如当程序检测到不符合预期的情况时,可以主动抛出异常来终止当前操作并提示错误信息。示例如下:
 
def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("除数不能为零!")
    return a / b

try:
    result = divide(10, 0)
except ZeroDivisionError as e:
    print(e)

在这个例子中,divide 函数会检查除数是否为零,如果为零则使用 raise 语句抛出 ZeroDivisionError 异常。在 try 块中调用 divide 函数时,由于除数为零,会引发异常并被 except 块捕获,然后打印出异常信息。

6. 自定义异常

除了使用 Python 内置的异常类型,我们还可以自定义异常类。自定义异常类通常继承自 Exception 类或其子类。示例如下:
 
class MyError(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return self.message

def check_age(age):
    if age < 0:
        raise MyError("年龄不能为负数!")
    return age

try:
    age = check_age(-5)
except MyError as e:
    print(e)

在这个例子中,我们定义了一个自定义异常类 MyError,它继承自 Exception 类。在 check_age 函数中,如果传入的年龄为负数,就会抛出 MyError 异常。在 try 块中调用 check_age 函数时,由于传入的年龄为负数,会引发自定义异常并被 except 块捕获,然后打印出异常信息。

通过以上这些异常处理机制,我们可以让 Python 程序更加健壮,能够更好地应对各种意外情况。

posted on 2025-03-10 09:36  数据与人文  阅读(38)  评论(0)    收藏  举报