选择哪一行例外报告 - python

假设我在Python中有一条多行引发异常。

Python如何确定针对哪个行引发异常?

示例:(注意:我本可以在每行之后使用反斜杠\

(1
 +0/0
 +3)

解决第3行的异常(ZeroDivisionError异常,位于+3))。

(1
 +
 0/0
 )

在第3行引发异常。

(0/0
 +
 1)

在第2行引发异常。

这个问题是受this example和@Godman pointed out的启发的,异常不仅仅发生在最后一行(就像我以前想的那样)。

参考方案

从根本上说,我不认为我们都在正确的思路上进行思考。这里没有最后一行。当解释器完全接收到表达式时,将引发异常。根据Python语法:http://docs.python.org/reference/grammar.html,该表达式直到单击右括号')'时才完全完成。 Joran Beasley在对问题本身的评论中对此做了简短的解释。

您可以做三件事来判断其正确性,而无需深入研究语法:

在python解释器中编写以下代码:

a =(1 + 2 + 0/0 + 4 + 5)

这也会引发ZeroDivionError。

在python解释器中编写以下代码:

a =(1 + 2 + 0/0 + 4 + 5#然后按Enter

由于表达式不完整并且无法由解释器解析,因此这给您带来了无效的语法
PS:这与问题中提到的代码相同

在python解释器中编写以下代码:

a =(1
+2
+0/0
+4
+5)

最终,表达式不完整,直到您敲了右括号。因此,您可以继续在其中添加更多的子表达式而不会出现任何异常。因此,从根本上讲,解释器不会将全部视为行号。等待所有表达式(包括子表达式)完成。而且,这是对插播者的适当编程控制流程。

PS:请原谅我的答案格式。

新编辑:-

// @海登:我认为通过不深入语法来解释这些细微之处很容易。但是,作为参考,我只是从以下URL复制代码:http://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html

运行步骤:-
1.将您在问题中询问的代码写入temp.py文件中并保存,然后将temp导入另一个文件或解释器中。这将创建temp.pyc
2.现在,将完整的代码复制并粘贴到byteCodeDetails.py的上述URL中,并在命令提示符下运行文件,如下所示:
python byteCodeDetails.py temp.pyc。函数show_file将在此处调用,并提供以下输出:-

魔术03f30d0a moddate 458c2e50(2012年8月17日星期五23:54:05)代码
argcount 0 nlocals 0 stacksize 3标志0040代码
640600640200640200151764030017640400175a000064050053 5
0 LOAD_CONST 6(3)
3 LOAD_CONST 2(0)
6 LOAD_CONST 2(0)
9 BINARY_DIVIDE
10 BINARY_ADD
11 LOAD_CONST 3(4)
14 BINARY_ADD
15 LOAD_CONST 4(5)
18 BINARY_ADD
19 STORE_NAME 0(a)
22 LOAD_CONST 5(无)
25个RETURN_VALUE常量
1个
2
0
4
5
没有
3个名称('a',)varnames()freevars()cellvars()filename'C:\ Users \ Python \ temp1.py'
名字''firstlineno 5 lnotab

因此,您可以注意到:-

从上述链接引用:
在反汇编输出中,最左边的数字(1、2、3)是原始源文件中的行号,下一个数字(0、3、6、9,...)是指令的字节偏移量。同样,对于您的代码,最左边的数字仅为5(即行号),而右边的列代表编译器为您的代码翻译的助记符(由解释程序读取),从而指示表达式格式,并且其格式被编译后的代码中的行号所取代。
firstlineno指向5。

现在,只需对temp.py文件中的初始代码进行一些更改:

a =(1
+2
+0/0
+4+
5)

现在,再次执行以上两个步骤。输出为:-

魔术03f30d0a moddate 0f8e2e50(2012年8月18日星期六00:01:43)
代码argcount 0 nlocals 0 stacksize 3
标志0040代码
640600640200640200151764030017640400175a000064050053 4
0 LOAD_CONST 6(3)
3 LOAD_CONST 2(0)
6 LOAD_CONST 2(0)
9 BINARY_DIVIDE
10 BINARY_ADD
11 LOAD_CONST 3(4)
14 BINARY_ADD

5 15 LOAD_CONST 4(5)
18 BINARY_ADD
19 STORE_NAME 0(a)
22 LOAD_CONST 5(无)
25个RETURN_VALUE常量
1个
2
0
4
5
没有
3个名称('a',)varnames()freevars()cellvars()文件名
'C:\ Users \ Python \ temp1.py'名称''firstlineno 4
兰塔布0f01

好吧,现在您可以清楚地看到两件事:

字节码由两行组成,在“代码640600640200640200151764030017640400175a000064050053”的下一行中显示,前缀为“ 4”和“ 5”。这表明编译器已经解析了.py文件,并将temp.py中的代码转换为两行代码,这些代码将由解释器运行。请注意,无论表达式是否完整,此处第4行的内容都将由解释器执行
firstlineno的值更改为4而不是5

冗长讨论的全部要点是,无论字节码向解释器指示的位置,这是一行的开始处以及应为此行执行的相应语句,然后,解释器仅运行该行,然后编写相应的语句对此。

您问题中的代码将firstlineno显示为5,这就是为什么您在第5行收到错误的消息。希望对您有所帮助。

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…