显然,当我的信号处理器退出时,我的程序继续运行。即使在“logdone,close now”之后也会引发异常,这一点很明显。 有人能解释一下为什么会这样吗?注:功能已简化
^Clog Ctrl-C
backup State: not_span 328, pos 22, all_cycles 19
backup backup complete, you may force exit now
log Done, close now
Traceback (most recent call last):
File "singleEdger.py", line 219, in <module>
mySingleEdger.outputAllCycles()
File "singleEdger.py", line 141, in outputAllCycles
r = self.returnCycle( self.dfs_tree, self.not_span[self.pos])
File "singleEdger.py", line 72, in returnCycle
udfs = nx.Graph(dfs) # The trick is to make it undirected
File "/var/lib/python-support/python2.6/networkx/graph.py", line 86, in __init__
convert.from_whatever(data,create_using=self)
File "/var/lib/python-support/python2.6/networkx/convert.py", line 76, in from_whatever
"Input is not a correct NetworkX graph."
networkx.exception.NetworkXError: Input is not a correct NetworkX graph.
这些都是可供参考的功能
^{pr2}$
{else>在处理过程中应该避免长时间的处理,这样就可以避免在处理过程中调用较长的信号。原因是(在Python中)信号处理程序仍将被注册,任何相同类型的后续信号都将中断信号处理程序本身,导致它再次执行。这可能不是你想要的。在
或者您可以忽略处理程序中的信号,例如
但请注意,这只会忽略同一个信号-它仍然有可能被其他信号中断。您的
backup()
是否可重入?在This discussion on reentrancy是相关的,尽管它是wrt C和Python有点不同,例如,不能阻塞信号(除非使用
ctypes
)。在如果在按下^C时在正在进行的代码周围有一个try/except块,它将不起作用,因为exit()实际上引发了一个异常。见http://bugs.python.org/issue8021
即使try块不在您自己的代码中,而是在您所调用的库代码中,也是如此。我在编写的robot循环中使用urllib2.urlopen时注意到了这一点;urllib2的do\u open()例程在尝试连接到URL的代码周围使用try/except。在
我不认为你的代码还在运行。尽管异常输出在代码中的位置不同,但它不能保证在您的最终打印消息之前出现。异常输出将发送到STDERR,但是print语句将发送到STDOUT;在本例中,这两个语句恰好都在写入同一个终端设备。这两者是独立的缓冲区,所以输出的顺序不是强制性的;也就是说,你不能从输出的相对位置推断任何东西。在
如果将print语句放入单元测试中,您可以在单元测试框架中看到相同的现象。在
相关问题 更多 >
编程相关推荐