为什么我可以捕获由 eval 代码引发的 SyntaxError(或 IndentationError 或 TabError),但却不能捕获由源代码本身引起的错误?
- 2025-01-10 08:46:00
- admin 原创
- 167
问题描述:
考虑以下两个片段:
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 某些代码时,您会在运行时对其进行解析,因此您可以捕获异常。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD