为什么我可以捕获由 eval 代码引发的 SyntaxError(或 IndentationError 或 TabError),但却不能捕获由源代码本身引起的错误?
- 2025-01-10 08:46:00
- admin 原创
- 14
问题描述:
考虑以下两个片段:
try:
a+a=a
except SyntaxError:
print "first exception caught"
。
try:
eval("a+a=a")
except SyntaxError:
print "second exception caught"
在第二种情况下,会打印“第二个异常..”语句(捕获到异常),而在第一种情况下则不会。
第一个异常(我们称之为“SyntaxError1”)与第二个异常(“SyntaxError2”)有什么不同吗?
有没有办法捕获 SyntaxError1(从而抑制编译时错误)?包装大块代码eval
是不能令人满意的 ;)
解决方案 1:
在第一种情况下,异常是由编译器引发的,它在结构存在之前就开始运行了(因为编译器本身会在解析后立即设置它)。在第二种情况下,编译器运行了两次——当编译器作为 的一部分运行时,异常被引发,而第一次运行编译器已经设置了。try/except
`eval`try/except
因此,为了拦截语法错误,不管怎样,您都必须安排编译器运行两次——eval
一种方式是显式compile
内置函数调用,另一种方式import
是相当方便(在将代码写入另一个文件之后),exec
还有execfile
其他可能性。但无论您如何做,语法错误只有在编译器运行第一次以设置try/except
您需要的块之后才能被捕获!
解决方案 2:
简短回答:不。
语法错误发生在代码被解析的时候,对于正常的 Python 代码来说,这是在代码被执行之前 - 由于代码没有执行,所以代码不会在 try/except 块内执行,就是这样。
但是,当您 eval 或 exec 某些代码时,您会在运行时对其进行解析,因此您可以捕获异常。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD