热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第十九天-类的约束、异常处理与日志记录

本文介绍了如何通过类的约束来确保代码的一致性,以及如何使用异常处理和日志记录来提高代码的健壮性和可维护性。具体包括抛出异常、使用抽象类和方法,以及异常处理和日志记录的详细示例。
### 类的约束 #### 为什么需要类的约束? 在开发过程中,团队成员可能会编写不同的类来实现相同的功能。为了确保代码的一致性和可维护性,我们需要对这些类进行约束,确保每个类都实现了必要的方法。 #### 示例:贴吧登录 假设我们需要实现一个贴吧登录功能,不同的开发人员可能会有不同的实现方式。例如: ```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格式文本,并进行数据处理和保存。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
author-avatar
xinlang138438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有