【问题标题】:How to catch EINTR in Python?如何在 Python 中捕获 EINTR?
【发布时间】:2013-03-18 10:04:15
【问题描述】:

我的问题是由 EINTR 信号引起的(如果我没记错的话),该信号会在执行 select 之类的系统调用时引发错误。这个问题在互联网上无处不在,并且有很好的描述的解决方案,但它们都不适合我。 在多线程应用程序中,我使用许多选择调用(我有 TCP 服务器和单独的 TCP 客户端),当我调用系统锁定(我的应用程序这样做,通过 gnome-screensaver-commands -lock)随机选择抛出:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
  File "/home/aziemek/Desktop/Zablokowanie uśpienia/server.py", line 45, in run
inputready,outputready,exceptready = select.select([self.server],[],[],TIME_TO_CHECK/2)
error: (4, 'Interrupted system call')

这就是我尝试缓存 EINTR 的方式:

try:
    inputready,outputready,exceptready = select.select([self.client],[],[],TIME_TO_CHECK*2) 
except EnvironmentError as why:
    print("Blad ta :" + str(why.args[0]))
    if why.args and why.args[0] != EINTR:
        print("Error during server loop" + why)
    else:
        continue
except socket.error as why:
    print("Blad ta :" + str(why.args[0]))
    if why.args and why.args[0] != EINTR:
        raise
    else:
        continue
except Exception as why:
    print("Blad to :" + str(why.args[0]))
except:
    print("Blad niewiadomy")

没有一个“except”子句可以捕捉到这个异常——即使是最后两个。系统:Linux Ubuntu,Python 2.6.5。

【问题讨论】:

    标签: python linux exception-handling signals


    【解决方案1】:

    你要抓OSError, select.error:

    import select
    # ...
    
    except (OSError, select.error) as why:
        # ...
    

    OSError 所以你是向前兼容的;您的回溯正在处理select.error

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2021-11-18
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多