ユーザーが安全に+KeyboardInterrupt
を使用して終了できるように、例外をキャッチする Python スクリプトを作成するとします。CtrlC
ただし、すべての重要なアクション (ファイルの書き込みなど) をcatch
ブロックに入れることはできません。これは、ローカル変数に依存し、その後のCtrl+がブロックCを壊さないようにするためです。
空の ( pass
)try
部分とその部分内のすべてのコードを含む try-catch ブロックを使用しfinally
て、このスニペットを途中で中断されない可能性のある「アトミックで割り込みセーフなコード」として定義することはうまくいきますか?
例:
try:
with open("file.txt", "w") as f:
for i in range(1000000):
# imagine something useful that takes very long instead
data = str(data ** (data ** data))
try:
pass
finally:
# ensure that this code is not interrupted to prevent file corruption:
f.write(data)
except KeyboardInterrupt:
print("User aborted, data created so far saved in file.txt")
exit(0)
この例では、現在生成されているデータ文字列は気にしません。つまり、作成が中断され、書き込みがトリガーされない可能性があります。しかし、書き込みが開始されたら、それを完了する必要があります。それが私が保証したいすべてです。また、finally 句内で書き込みを実行中に例外 (または KeyboardInterrupt) が発生した場合はどうなりますか?