第十九天-类的约束、异常处理与日志记录
作者: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`模块记录日志,帮助调试和维护程序。
推荐阅读
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ...
[详细]
蜡笔小新 2024-12-27 15:04:09
本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ...
[详细]
蜡笔小新 2024-12-26 16:06:09
本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ...
[详细]
蜡笔小新 2024-12-28 10:51:55
本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 08:39:55
1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ...
[详细]
蜡笔小新 2024-12-27 18:36:54
本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ...
[详细]
蜡笔小新 2024-12-26 17:45:48
蜡笔小新 2024-12-26 13:29:32
本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ...
[详细]
蜡笔小新 2024-12-26 08:25:19
本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ...
[详细]
蜡笔小新 2024-12-28 11:52:00
Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ...
[详细]
蜡笔小新 2024-12-28 09:44:49
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 中的 BigDecimal pow()方法,示例 ...
[详细]
蜡笔小新 2024-12-27 20:54:03
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ...
[详细]
蜡笔小新 2024-12-23 14:15:06
xinlang138438
这个家伙很懒,什么也没留下!