当前位置: 首页 > news >正文

Python基础知识 (九)os模块、异常、异常的传递性

目录

OS模块

目录的具体操作

什么是异常

异常常见处理方式

异常分类:

捕获一个指定异常

捕获多个异常

捕获所有异常

异常具有传递性


OS模块

在Python中,os模块的常用函数分为两类:

(a)通过os.path调用的函数

(b)通过os直接调用的函数

在Python的os模块中,通过os.path常用函数:

函数名含义
exists(pathname)用来检验给出的路径是否存在。
isfile(pathname)用来检验给出的路径是否是一个文件。
isdir(pathname)用来检验给出的路径是否是一个目录。
abspath(pathname)获得绝对路径。
join(pathname,name)连接目录与文件名或目录。
basename(pathname)返回单独的文件名。
dirname(pathname)返回文件路径。

说明:

上述常用函数需要使用os.path来进行调用。

import os# 定义变量
path = "./data/file/hello.txt"
# 是否存在
print(os.path.exists(path))
# 是否是文件
print(os.path.isfile(path))
# 目录
print(os.path.isdir(path))  # False
# 绝对路径
print(os.path.abspath(path))
# 单独文件名
print(os.path.basename(path))
目录的具体操作

在Python的os模块中,可直接通过os调用的常用函数:

函数名含义
getcwd()获得当前工作目录,即当前Python脚本工作的目录路径。
system(name)运行shell命令。
listdir(path)返回指定目录下的所有文件和目录名,即获取文件或目录列表。
mkdir(path)创建单个目录。
makedirs(path)创建多级目录。
remove(path)删除一个文件。
rmdir(path)删除一个目录。
rename(old, new)重命名文件。

说明:

上述常用函数可直接使用os来进行调用。

import os# 1.获取目录
path = os.getcwd()
print(path)# 2.获取文件或列表信息
path_name = "./data/file"
dir_lists = os.listdir(path_name)
print(dir_lists)# 3.新建目录
# 问题: 当目录不存在时,才需要创建; 已存在, 则不创建
new_path_name = "./data/file/hello/world/python"
if not os.path.exists(new_path_name):   # 逻辑# 创建os.makedirs(new_path_name)print("已创建成功!!!")

什么是异常

异常指的是Python程序发生的不正常事件。

有时候,异常可称为错误。

当检测到一个错误时,Python解释器就无法继续执行,反而出现了一些错误的提示,这就是异常,也就是我们常说的BUG。

# 1.正常
print("Hello1")
print("Hello2")
# 2.异常处理
try:datas = [1,2,3]print(datas[100])  # 崩溃
except:pass
print("Hello3")
print("Hello4")

异常常见处理方式

异常处理语法:

try:可能发生异常的代码
except:如果出现异常时, 执行的代码

说明:

try、except都是关键字,用于处理异常。

# 1.制造异常
# 2.处理
try:datas = [1,2,3]print(datas[100])  # 中断
except:print("已经发生了异常》。。")
print("11111111111111")   # 当处理了异常后,程序可以稳定继续往后执行代码

异常分类:

捕获异常是处理异常的标准形式。通常情况下,捕获异常分为三类:

(1)捕获一个指定异常

(2)捕获多个异常

(3)捕获所有异常

捕获一个指定异常

来看看捕获一个指定异常的语法:

try:可能发生异常的代码
except 异常类型名:当捕获到该异常类型时,执行的代码
捕获多个异常

捕获多个异常指的是:可以对一段可能发生异常的代码做多个异常类型的判断处理。

try:可能发生异常的代码
except (异常类型1,类型2,...):如果捕获到该异常类型时,执行的代码
# 1.可能发生异常的代码
try:dicts = {}print(dicts["name"])data = [1,2,3]print(data[100])
# 2.处理异常
except IndexError as error:print(f"可能会发生异常.=={error}")
except KeyError:print("可能会发生keyerror...")print("11111111111111")# 升级
try:dicts = {}print(dicts["name"])data = [1,2,3]print(data[100])# 2.处理异常
except (IndexError,KeyError) as error:print(f"可能会发生异常.=={error}")
捕获所有异常

要知道的是,Exception是表示所有程序异常类的父类,即使用Exception可以表示一切异常。

捕获所有异常语法:

try:可能发生异常的代码
except Exception[ as 变量]:当捕获到该异常类型时,执行的代码

说明:

Exception的首字母要大写。

# 1.可能会发生异常的代码
# 2.捕获所有异常
try:data = [1, 2, 3]print(data[100])dicts = {}print(dicts["name"])
except Exception as error:print(f"发生了异常信息...{error}")
print("hello world..")# 1.可能会发生异常的代码
# 2.捕获所有异常
try:data = [1, 2, 3]print(data[100])dicts = {}print(dicts["name"])
except Exception as error:print(f"发生了异常信息...{error}")
print("hello world..")

在捕获异常过程中,有两个关键字else、finally需要注意:

else:表示如果没有异常时,要执行的代码;
finally:表示的是无论是否有异常,都要执行的代码。

当把else、finally都放入到捕获异常中,语法:

try:可能发生异常的代码
except 异常类型:当捕获到该异常类型时,执行的代码
else:没有异常信息时,执行的代码
finally:无论如何,都会执行的代码

例如,一起来完成:

# 1.制造异常
# 2.处理 指定异常
try:data = [1, 2, 3]print(data[100])# print(data[0])
except IndexError:print("====1====已发生异常信息!")
else: # 3.else:没有发生异常时,处理的事情print("没有发生异常时,才会执行代码!!")
finally:# 4.finally:文件必须关闭print("无论如何,都会执行finally!!")

异常具有传递性

# 1.func()
def func():print("==========A============")try:datas = [1,2,3]print(datas[100])except Exception:# 日志、埋点?    -->采集print("发生了异常信息...")   # 后台开发print("==========B============")# 2.test()
def test():print("********1***********")func()print("********2***********")# 3.调用test()
test()

总结:

(1)当一段可能发生异常的代码,发生了异常时,若不处理,则会传递给调用处;

(2)注意:标准的异常处理方式是()。A、捕获异常;  B、抛出异常;

解析:A 捕获异常和 B 抛出异常都是异常处理机制中的重要环节,单独选一个都不太准确。但相对来说,捕获异常可以在局部对异常进行处理,保证程序的稳定性,在一些情况下更为常用。

综上所述,没有绝对标准的单一答案,需根据具体情况综合运用这两种方式进行异常处理。

相关文章:

  • MySql语言操作数据库---MySql引擎,数据表,约束,基本查询,条件查询
  • 光耦知识分享 | 浅析施密特触发器光耦的主要特点
  • golang 反射的介绍和使用
  • 别人都在百度云智大会上吹,我就说点别的……
  • Linux进程:fork函数深度剖析
  • “天翼云息壤杯”高校AI大赛开启:国云的一场“造林”计划
  • 【Vite】如何阻止Vite对较小图片的默认处理
  • k8s pv(PersistentVolume) 状态含义
  • 连锁收银系统的五大功能 选择开源收银系统三要素
  • 【机器学习(十二)】机器学习回归案例之二手汽车价格预测—XGBoost回归算法—Sentosa_DSML社区版
  • 生成式人工智能在软件开发中的角色
  • SpringBoot开发——使用Hutool工具包处理日期时间详解
  • Cocos Creator 剪裁精灵图片方法记录(7)
  • C++20 std::format
  • Unity中Mesh使用MeshTopology.Lines模式绘制线条及MeshTopology.Quads模式绘制网格参考
  • @angular/forms 源码解析之双向绑定
  • [NodeJS] 关于Buffer
  • 【node学习】协程
  • Apache Pulsar 2.1 重磅发布
  • github指令
  • HashMap剖析之内部结构
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript的使用你知道几种?(上)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • k8s如何管理Pod
  • Laravel核心解读--Facades
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • React Transition Group -- Transition 组件
  • SAP云平台里Global Account和Sub Account的关系
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 记录:CentOS7.2配置LNMP环境记录
  • 应用生命周期终极 DevOps 工具包
  • 用 Swift 编写面向协议的视图
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ###项目技术发展史
  • #Ubuntu(修改root信息)
  • #每日一题合集#牛客JZ23-JZ33
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (PADS学习)第二章:原理图绘制 第一部分
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (备份) esp32 GPIO
  • (初研) Sentence-embedding fine-tune notebook
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)计算机毕业设计高校学生选课系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (七)Flink Watermark
  • (四)Linux Shell编程——输入输出重定向
  • (转)h264中avc和flv数据的解析
  • (转)winform之ListView
  • (转)可以带来幸福的一本书
  • .NET Framework杂记
  • .net mvc部分视图
  • .net的socket示例