1

私の問題は、selectなどのシステムコールの実行中にエラーが発生するEINTRシグナルが原因で発生します(間違っていない場合)。この問題はインターネットのいたるところにあり、よく説明されている解決策がありますが、それらのすべてが私のために機能していません。マルチスレッドアプリケーションでは、多くのselect呼び出しを使用します(TCPサーバーと個別にTCPクライアントがあります)。システムロックを呼び出すと(私のアプリケーションは、gnome-screensaver-commands -lockによってそれを行います)、ランダムなselectがスローされます。

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」句はどれもこの例外をキャッチできません-最後の2つですら。システム:Linux Ubuntu、Python2.6.5。

4

1 に答える 1

2

あなたがキャッチしたいOSError, select.error

import select
# ...

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

OSErrorしたがって、上位互換性があります。トレースバックはを処理していselect.errorます。

于 2013-03-18T10:08:35.247 に答える