1 Star 0 Fork 1

pish7/stdpython

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
exception.01.py 2.91 KB
一键复制 编辑 原始数据 按行查看 历史
pish7 提交于 2025-12-28 01:28 +08:00 . python
# 使用 except 捕获所有的异常很危险,因为这不仅会隐藏你有心理准备的错误,还会隐藏你没有考虑过的错误。
# 这还将捕获用户使用 Ctrl+C 终止执行的企图、调用函数 sys.exit 来终止执行的企图等。
# 在大多数情况下,更好的选择是使用 except Exception as e 并对异常对象进行检查。
# 这样做将让不是从 Exception 派生而来的为数不多的异常成为漏网之鱼,
# 其中包括 SystemExit 和 KeyboardInterrupt,因为它们是从 BaseException(Exception的超类)派生而来的。
# 使用 raise 来抛出异常,后面可跟一个异常类(这时将自动创建一个实例)或一个异常实例
# raise Exception
# raise Exception("我是异常信息")
# raise #再次抛出异常(用于except语句中)
# 创建异常类,必须直接或间接地继承自 Exception
class MyException1(Exception):
pass
class MyException2(Exception):
def __init__(self, msg="no msg"):
self.msg = msg
try:
val = int(input("请输入数值:"))
if val == 0:
# 使用 raise 来抛出异常
raise MyException2("zero")
elif val == 1:
raise MyException1(val)
# 可以抛出异常对象,也可以抛出异常类
raise Exception
except MyException1 as e:
# [as e]是可选的,用于获取异常对象
print("get MyException", e)
raise # 再次抛出异常
# 使用元组来捕获多种异常 (ZeroDivisionError, TypeError, NameError) as e
except (ZeroDivisionError, TypeError, NameError) as e:
print("使用一个元组来捕获多种异常", e)
except Exception as e:
# 注意,这个 except 并不能捕获所有异常,因为 Exception 上头还有基类 BaseException
try:
# 这里直接访问 e 的 msg 属性,不管 e 中是否有 msg 属性,有则大吉,无则在 except 中处理
print("get it:", e.msg) # ty:ignore[unresolved-attribute]
except:
# 抛出其它异常,那么前面捕获到的异常也会存在于“异常链”中,即异常上下文中
# 完整的写法是 `raise ValueError from e`
raise ValueError
except:
# 可捕获任意异常
print("all except")
# 重新抛出异常时会自动传递异常上下文
# 可以使用 from 来指定异常上下文,包括 None 值来指定没有上下文
raise ValueError from None
else:
# 没有发生异常,注意,不是“没有捕获到异常”
print("很好,没有异常发生 ")
finally:
# 即使是 raise 或 return 也不能阻止 finally 子句的运行
print("总是执行")
# 可选择是否抑制异常的“计算器”类
class MuffledCalculator:
muffled = False # 是否抑制异常
def calc(self, expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print("Division by zero is illegal")
else:
raise
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/pish7/stdpython.git
git@gitee.com:pish7/stdpython.git
pish7
stdpython
stdpython
master

搜索帮助