第十九天-类的约束、异常处理与日志记录
作者: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`模块记录日志,帮助调试和维护程序。
推荐阅读
本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ...
[详细]
蜡笔小新 2024-12-26 16:06:09
Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ...
[详细]
蜡笔小新 2024-12-28 08:54:34
本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ...
[详细]
蜡笔小新 2024-12-27 15:06:12
本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ...
[详细]
蜡笔小新 2024-12-27 15:04:09
本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ...
[详细]
蜡笔小新 2024-12-26 17:45:48
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ...
[详细]
蜡笔小新 2024-12-23 14:15:06
在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ...
[详细]
蜡笔小新 2024-12-21 15:46:52
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ...
[详细]
蜡笔小新 2024-12-27 16:11:49
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ...
[详细]
蜡笔小新 2024-12-27 13:14:08
本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ...
[详细]
蜡笔小新 2024-12-27 11:39:44
本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ...
[详细]
蜡笔小新 2024-12-22 19:11:04
本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ...
[详细]
蜡笔小新 2024-12-21 14:48:49
xinlang138438
这个家伙很懒,什么也没留下!