第十九天-类的约束、异常处理与日志记录
作者:xinlang138438 | 来源:互联网 | 2024-11-14 06:38
本文介绍了如何通过类的约束来确保代码的一致性,以及如何使用异常处理和日志记录来提高代码的健壮性和可维护性。具体包括抛出异常、使用抽象类和方法,以及异常处理和日志记录的详细示例。
### 类的约束
#### 为什么需要类的约束?
在开发过程中,团队成员可能会编写不同的类来实现相同的功能。为了确保代码的一致性和可维护性,我们需要对这些类进行约束,确保每个类都实现了必要的方法。
#### 示例:贴吧登录
假设我们需要实现一个贴吧登录功能,不同的开发人员可能会有不同的实现方式。例如:
```python
# 张三版
class Normal:
def login(self):
print("普通账号登录")
# 李四版
class Member:
def login(self):
print("吧务账号登录")
# 王二版
class Admin:
def denglu(self):
print("管理员登陆")
# 项目经理调用
def login(obj):
obj.login()
n = Normal()
login(n)
m = Member()
login(m)
a = Admin()
login(a) # 报错 'Admin' object has no attribute 'login'
```
为了避免这种调用失败的情况,我们需要对类的结构进行约束。
### 方法一:抛出异常
可以通过定义一个基类,并在基类中抛出异常来强制子类实现特定的方法。
```python
class Base:
def login(self):
raise NotImplementedError("子类没有实现该方法")
# 张三版
class Normal(Base):
def login(self):
print("普通账号登录")
# 李四版
class Member(Base):
def login(self):
print("吧务账号登录")
# 王二版
class Admin(Base):
def login(self):
print("管理员登陆")
# 项目经理调用
def login(obj):
obj.login()
n = Normal()
login(n)
m = Member()
login(m)
a = Admin()
login(a)
```
### 方法二:使用抽象类和方法
可以使用Python的`abc`模块来定义抽象类和方法,从而强制子类实现特定的方法。
```python
from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def login(self):
pass
def hehe(self):
print("呵呵呵")
# 张三版
class Normal(Base):
def login(self):
print("普通账号登录")
# 李四版
class Member(Base):
def login(self):
print("吧务账号登录")
# 王二版
class Admin(Base):
def login(self):
print("管理员登陆")
# 项目经理调用
def login(obj):
obj.login()
n = Normal()
login(n)
m = Member()
login(m)
a = Admin()
login(a)
```
### 异常处理
在Python中,可以使用`try...except`语句来处理异常,确保程序在遇到错误时能够继续运行。
```python
try:
print(1/0) # 0不能做除数 ZeroDivisionError: division by zero
except ZeroDivisionError as z:
print("错了. 除数不能为0")
import traceback
def cul(a, b):
if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
return a + b
else:
raise Exception("我要的不是这个. 你应该我传递int或者float")
try:
print(cul(1, 2))
print(cul(1, "疙瘩汤"))
except Exception as e:
print(traceback.format_exc()) # 获取堆栈信息
print("有误")
```
### 日志记录
日志记录是调试和维护程序的重要工具。可以使用Python的`logging`模块来记录日志。
```python
import logging
# 简单配置logging
logging.basicConfig(filename='x1.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.WARNING)
logging.critical("我是critical")
logging.error("我是error")
logging.warning("我是warning")
logging.info("我是info")
logging.debug("我是debug")
logging.log(1, "我什么都不是")
# 例子,接上面
import traceback
try:
print(1/0)
except Exception:
logging.error(traceback.format_exc()) # 用法
print("出错了")
# 把日志文件分开 FileHandler
file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8')
file_handler.setFormatter(logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s'))
logger1 = logging.Logger('A系统', level=logging.ERROR)
logger1.addHandler(file_handler)
logger1.error('我是A系统')
file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8')
file_handler2.setFormatter(logging.Formatter(fmt='%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s'))
logger2 = logging.Logger('B系统', level=logging.ERROR)
logger2.addHandler(file_handler2)
logger2.error('我是B系统')
```
### 总结
1. **抛出异常**:通过在基类中抛出`NotImplementedError`来强制子类实现特定的方法。
2. **使用抽象类**:通过`abc`模块定义抽象类和方法,确保子类实现特定的方法。
3. **异常处理**:使用`try...except`语句来处理程序中的异常,确保程序的健壮性。
4. **日志记录**:使用`logging`模块记录日志,帮助调试和维护程序。
推荐阅读
-
docker镜像重启_docker怎么启动镜像dock ...
[详细]
蜡笔小新 2024-12-20 16:34:52
-
本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ...
[详细]
蜡笔小新 2024-12-21 18:50:52
-
-
SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ...
[详细]
蜡笔小新 2024-12-20 19:05:12
-
本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ...
[详细]
蜡笔小新 2024-12-20 12:12:15
-
springMVC JRS303验证 ...
[详细]
蜡笔小新 2024-12-20 09:07:39
-
本文探讨了在Spring Boot项目中进行单元测试时遇到Redis连接问题的原因及解决方法,详细分析了配置文件加载路径不当导致的问题,并提供了有效的解决方案。 ...
[详细]
蜡笔小新 2024-12-22 16:14:00
-
本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ...
[详细]
蜡笔小新 2024-12-21 23:50:40
-
本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ...
[详细]
蜡笔小新 2024-12-21 19:23:01
-
在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ...
[详细]
蜡笔小新 2024-12-21 16:55:52
-
本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ...
[详细]
蜡笔小新 2024-12-21 11:11:40
-
探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ...
[详细]
蜡笔小新 2024-12-21 10:13:36
-
先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ...
[详细]
蜡笔小新 2024-12-20 18:17:25
-
本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ...
[详细]
蜡笔小新 2024-12-20 17:58:54
-
本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ...
[详细]
蜡笔小新 2024-12-20 15:43:37
-
本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ...
[详细]
蜡笔小新 2024-12-20 14:38:17
-
xinlang138438
这个家伙很懒,什么也没留下!