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 程序更加健壮,能够更好地应对各种意外情况。
浙公网安备 33010602011771号