第十九天-类的约束、异常处理与日志记录
作者: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`模块记录日志,帮助调试和维护程序。
推荐阅读
-
高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ...
[详细]
蜡笔小新 2024-11-20 15:47:04
-
本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ...
[详细]
蜡笔小新 2024-11-21 17:38:10
-
-
本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ...
[详细]
蜡笔小新 2024-11-20 19:26:30
-
本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ...
[详细]
蜡笔小新 2024-11-20 19:24:42
-
目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ...
[详细]
蜡笔小新 2024-11-18 20:33:30
-
在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ...
[详细]
蜡笔小新 2024-11-18 16:46:17
-
长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ...
[详细]
蜡笔小新 2024-11-21 18:21:06
-
publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ...
[详细]
蜡笔小新 2024-11-21 16:25:41
-
Web动态服务器Python基本实现 ...
[详细]
蜡笔小新 2024-11-21 08:01:30
-
本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ...
[详细]
蜡笔小新 2024-11-20 17:21:26
-
本文介绍了一种方法,通过使用Python的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ...
[详细]
蜡笔小新 2024-11-20 16:35:59
-
本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ...
[详细]
蜡笔小新 2024-11-17 11:47:30
-
本文详细介绍了如何在PHP中屏蔽警告和错误,包括多种方法和最佳实践,帮助开发者提升代码质量和安全性。 ...
[详细]
蜡笔小新 2024-11-16 02:00:40
-
在项目需要国际化处理时,即支持多种语言切换的功能,通常有两种方案:单个包和多个包。本文将重点讨论单个包的实现方法。 ...
[详细]
蜡笔小新 2024-11-16 00:33:31
-
本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ...
[详细]
蜡笔小新 2024-11-12 19:49:05
-
xinlang138438
这个家伙很懒,什么也没留下!