呼び出した処理の中にexitがあってもプログラムを終了させないようにする方法をメモ書きします。
今回は諸事情によりreturn
への書き換えが行えない状況です。
exitとreturnの違い
exit
とreturn
の違いはざっくり言うと次の通り。
exit
:実行するとプログラムが終了する
return
:呼び出し元関数に値を返し、呼び出し元関数を終了する
処理内容
main_process.py
を実行した際に後続処理A
を表示させたいのですが、手前のexit_process.execute()
を実行すると、exit(0)
によりプログラムの実行が終了してしまいます。
exit
をreturn
に書き換えれば話は早いのですが、今回はexit
のままにしておきたい状況です。
from work import exit_process
exit_process.execute()
print("後続処理A")
def execute():
print("exitを実行します")
exit(0)
exitを実行します
プロセスは終了コード 0 で完了しました
解決方法
exit()
はBaseException
例外を投げることによってプログラムを終了する仕組みとなっています。
つまり、try
ブロックの中で呼べばプログラムが終了しなくなります。
main_process.py
を次のように書き換えて実行してみます。
from work import exit_process
try:
exit_process.execute()
except BaseException as e:
print(e)
print("後続処理A")
すると、後続処理A
が表示させるようになりました。
exit
の戻り値はe
から取得できます。
exitを実行します
0
後続処理A
プロセスは終了コード 0 で完了しました
if文を使用する際の注意点
exit
の戻り値をe
で受け取りif文で条件分岐を行うことができますが、e
の型はSystemExit
なので文字列型に変換してから使用する必要があります。
戻り値が0なのに上手く条件分岐しない
from work import exit_process
try:
exit_process.execute()
except BaseException as e:
print(type(e))
print(e)
if 0 == e:
print("後続処理A")
else:
print("後続処理B")
exitを実行します
<class 'SystemExit'>
0
後続処理B
プロセスは終了コード 0 で完了しました
文字列に変換すると上手く条件分岐する
if 0 == e:
をif "0" == str(e)
に書き換えると意図した通りに動作します。
from work import exit_process
try:
exit_process.execute()
except BaseException as e:
print(type(e))
print(e)
if "0" == str(e):
print("後続処理A")
else:
print("後続処理B")
exitを実行します
<class 'SystemExit'>
0
後続処理A
プロセスは終了コード 0 で完了しました