私のpython try/exceptループは、pycharmでコードをデバッグしているときにCtrl + Cを押すとキーボード割り込みをトリガーしないようです。私のコードは次のようになります:
numbers = []
loop = True
try:
# ===========SUBROUTINES==================
def help():
print("To view the list type 'view'"
"\n To add an item type 'add'"
"\n To remove an item type 'remove'"
"\n To exit type exit or Ctrl + c can be used at any time")
# =========SUBROUTENES END===============
while loop:
task = input("What do you want to do? Type \"help\" for help:- ")
if task == 'help':
help()
else:
print("Invalid return please try again.")
except KeyboardInterrupt:
exit()
編集:スリム化されたコードが機能し、同じエラーが発生しないことに問題があるようです。完全なコードは、 ここ で確認できます。また、コード(上記のコード)をスリム化しましたが、同じエラーが発生しました。
スクリーンショットから、このコードをIDEで実行しているように見えます。 IDEの特徴は、特にキーボード文字の処理に関しては、通常の実行とまったく同じではないということです。 ctrl-cを押すと、IDEはテキストをコピーしたいと考えます。pythonプログラムは文字を認識しません。おそらく別のウィンドウが表示されます。実行中の場合は、ctrl-cの前にそのウィンドウを選択します。
変数「x」をコードに入れて、代わりにtabsを使用しているため、ここでは正常に機能していますspaces。
try:
def help():
print("Help.")
def doStuff():
print("Doing Stuff")
while True:
x = int(input())
if x == 1:
help()
Elif x == 2:
doStuff()
else:
exit()
except KeyboardInterrupt:
exit()
これは古い質問であることはわかっていますが、同じ問題に遭遇し、より簡単な解決策があると思います。
PyCharmで「実行」/「構成の編集」に移動し、「出力コンソールで端末をエミュレートする」をチェックします。 PyCharmがキーボード割り込みを受け入れるようになりました(コンソールがフォーカスされていることを確認してください)。
テスト済み:PyCharm 2019.1(コミュニティ版)
そのコメントで問題が解決しない場合は(@tdelaneyから)、シェルウィンドウにフォーカスを当てる必要があります(つまり、プログラムの実行中にクリックしたことを意味します)。 Control+C
PyCharmのPythonコンソールを使用し、Ctrl + Cを使用することもできます。Ctrl+ Cが押されたときにPyCharmが発生する例外をキャッチする場合。is_keyboard_interrupt
という短い関数を以下に記述しました例外がPyCharmを含むKeyboardInterruptであるかどうかを通知します。そうでない場合は、単純に再度レイズします。以下のコードの簡略版を貼り付けます。
実行すると:
注:これはPyCharmのデバッガーコンソール(「実行」ではなく「デバッグ」によって呼び出されるもの)では機能しませんが、一時停止ボタンを押すだけでよいため、Ctrl + Cの必要性は少なくなります。
私はまた、これを私のGistに置いて、更新を行います: https://Gist.github.com/yulkang/14da861b271576a9eb1fa0f905351b97
def is_keyboard_interrupt(exception):
# The second condition is necessary for it to work with the stop button
# in PyCharm Python console.
return (type(exception) is KeyboardInterrupt
or type(exception).__name__ == 'KeyboardInterruptException')
try:
def print_help():
print("To exit type exit or Ctrl + c can be used at any time")
print_help()
while True:
task = input("What do you want to do? Type \"help\" for help:- ")
if task == 'help':
print_help()
else:
print("Invalid input.")
# to check that ValueError is handled separately
raise ValueError()
except Exception as ex:
try:
# Catch all exceptions and test if it is KeyboardInterrupt, native or
# PyCharm's.
if not is_keyboard_interrupt(ex):
raise ex
print('KeyboardInterrupt caught as expected.')
print('Exception type: %s' % type(ex).__name__)
exit()
except ValueError:
print('ValueError!')
Ctrl + cを押すときにウィンドウが選択されていることを確認してください。私はあなたのプログラムをIDLEで実行しましたが、それは私にとって完璧に機能しました。