下面是一个在Python中自定义异常的完整示例,包括定义异常、引发异常和捕获异常的过程:
### 定义自定义异常
首先,我们定义两个自定义异常类:`ShapeError`作为基类,用于所有形状相关错误的基类;`InvalidShapeOperationError`是当形状操作无效时引发的异常。
```python
class ShapeError(Exception):
""“所有形状相关错误的基类异常”""
pass
class InvalidShapeOperationError(ShapeError):
""“当形状操作无效时引发的异常”""
def __init__(self, message, shape_name):
super().__init__(f"Error with {shape_name}: {message}")
self.shape_name = shape_name
```
### 引发自定义异常
接下来,我们创建一个模拟形状操作的函数,当操作不合法时,抛出`InvalidShapeOperationError`异常。
```python
def scale_shape(shape, factor):
if not isinstance(factor, (int, float)):
raise InvalidShapeOperationError("Scale factor must be a number", shape.name)
# 假设存在一个scale方法,用于放大形状
shape.scale(factor)
print(f"Shape {shape.name} scaled by factor {factor}")
```
### 定义形状类
为了使上面的函数示例更完整,我们还需要定义一个简单的形状类:
```python
class Shape:
def __init__(self, name):
self.name = name
def scale(self, factor):
print(f"Scaling {self.name} by {factor}")
```
### 捕获自定义异常
最后,我们编写一个测试代码段,演示如何使用`try...except`语句捕获并处理自定义异常。
```python
def main():
circle = Shape("Circle")
try:
# 尝试用一个无效的因子缩放形状
scale_shape(circle, "100%")
except InvalidShapeOperationError as e:
print(f"Caught an invalid operation error: {e}")
# 其他程序代码...
if __name__ == "__main__":
main()
```
### 程序输出
运行上述程序,将产生以下输出:
```
Caught an invalid operation error: Error with Circle: Error with Circle: Scale factor must be a number
```