Error
Python 的错误处理机制通过异常处理来实现,允许程序在出现错误时优雅地处理,而不是直接崩溃。以下是对 Python 错误处理和自定义错误的详细介绍。自定义异常类使得开发者能够根据特定需求创建更具表现力的错误处理机制,从而增强代码的可读性和可维护性。通过合理使用异常处理,可以使程序在面对错误时更加稳健和友好。
1. 错误处理
1.1 异常的基本概念
异常是程序在运行时出现的错误。Python 提供了多种内置异常,例如 ValueError
、TypeError
、FileNotFoundError
等。
1.2 使用 try
和 except
基本的异常处理结构如下:
python
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("Cannot divide by zero!")
1
2
3
4
5
6
2
3
4
5
6
1.3 捕获多个异常
可以在一个 except
块中捕获多个异常:
python
try:
value = int(input("Enter a number: "))
result = 10 / value
except (ValueError, ZeroDivisionError) as e:
print(f"Error occurred: {e}")
1
2
3
4
5
2
3
4
5
1.4 异常确认
1.4.1 捕获多个异常并确认类型
python
try:
# 可能引发多个异常的代码
value = int(input("Enter a number: "))
result = 10 / value
except (ValueError, ZeroDivisionError) as e:
# 使用 isinstance() 确认具体异常类型
if isinstance(e, ValueError):
print("Caught ValueError: Invalid input. Please enter a valid number.")
elif isinstance(e, ZeroDivisionError):
print("Caught ZeroDivisionError: Cannot divide by zero!")
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
isinstance()
:检查 e
的类型,以确定具体是哪种异常,并执行相应的处理逻辑。
1.4.2 使用多个 except
块
你也可以使用多个 except
块来分别处理不同的异常,这样可以更清晰地确认每种异常的处理方式:
python
try:
value = int(input("Enter a number: "))
result = 10 / value
except ValueError:
print("Caught ValueError: Invalid input. Please enter a valid number.")
except ZeroDivisionError:
print("Caught ZeroDivisionError: Cannot divide by zero!")
1
2
3
4
5
6
7
2
3
4
5
6
7
1.5 使用 else
和 finally
else
: 在没有异常发生时执行的代码。finally
: 无论是否发生异常,都会执行的代码。
python
try:
file = open('file.txt', 'r')
except FileNotFoundError:
print("File not found.")
else:
content = file.read()
print(content)
finally:
if 'file' in locals():
file.close() # 确保文件被关闭
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
2. 自定义错误
2.1 创建自定义异常类
可以通过继承 Exception
类来创建自定义异常:
python
class MyCustomError(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
1
2
3
4
2
3
4
2.2 引发自定义异常
使用 raise
语句引发自定义异常:
python
def check_value(value):
if value < 0:
raise MyCustomError("Value cannot be negative!")
try:
check_value(-1)
except MyCustomError as e:
print(f"Custom error occurred: {e}")
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 示例
3.1 完整的异常处理示例
python
class NegativeValueError(Exception):
"""自定义异常,表示负值错误"""
pass
def calculate_square_root(value):
if value < 0:
raise NegativeValueError("Cannot calculate square root of a negative number.")
return value ** 0.5
try:
num = float(input("Enter a number: "))
result = calculate_square_root(num)
print(f"The square root is: {result}")
except ValueError:
print("Invalid input. Please enter a number.")
except NegativeValueError as e:
print(e)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17