为什么我可以捕获由 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: pri...

问题描述:

考虑以下两个片段:

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 某些代码时,您会在运行时对其进行解析,因此您可以捕获异常。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   997  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   34  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   40  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   39  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   71  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用