自動で動く仕組みを作ると、処理が終わるたびに数字がひとつ返ってきます。0なら成功、0以外は失敗。終了コードと呼ぶやつです。
この0、けっこう嘘をつきます。ここ数日で3つの型を踏みました。しかも1つは、前の日に踏んだばっかりの形を、翌日そのまま繰り返しとります。
終了コードが0でも、成功したとは限りません。理由はその0が誰の成績か分からんからです。表示を整える処理をひとつ後ろにつなぐだけで、本体の失敗は消えます。相手に断られたのに0が返る形もあります。0を見た時に、これは誰が出した0なんかを確かめる。それだけで見落としが止まりました。
終了コードって何なん
プログラムが終わる時、人間向けには画面に文字が出ます。完了しました、とか。それとは別に、機械向けの合図がひとつ出とります。それが終了コード。英語では exit code。
0が成功で、1とか3とか、0以外は失敗。人間が読む文章と違って数字ひとつなので、次に進んでええかを機械が判断できます。自動化はここを見て動いとります。
で、こっちも見ます。長い処理を回して最後に0が出とったら、ああ通ったな、と。そこが落とし穴でした。
型1|見やすくするために足した1本が、成否を乗っ取った
客に出す表を作るスクリプトがあって、中の数字が合っとるかを検算させとります。出力が長いので、最後の数行だけ表示するように処理をひとつ後ろにつなぎました。よくあるやつです。
結果は0。検算は通ったと思って先に進みました。
通ってませんでした。検算は正しく失敗して止まっとったんです。じゃあなんで0やったかというと、処理を後ろにつないだ時、最後に返る数字はいちばん後ろの処理のものになるからです。いちばん後ろは、最後の数行を切り出すだけの処理。切り出すのは必ず成功する。だから0。
本体は間違っとるぞと言うて止まっとったのに、その声が途中で消えた形です。
情けないのはここからで、翌日また同じ形で踏みました。今度は自作ツールの動作確認。0が出て一瞬信じかけて、取り直したら中身は別でした。
直し方は単純で、つながんこと。いったん結果をファイルに落として、終了コードはそのまま受け取る。長い出力は後からファイルを読めばええだけです。
型2|相手に断られたのに、手元は成功やった
ブログの予約公開を自動でやっとります。記事の番号と公開したい日時を渡すと、サーバーに予約を入れてくれる処理。
日時の書き方を間違えました。日付と時刻の間を半角スペースで空けたんですが、正しくは間にTの1文字を挟む形。サーバーは受け取って、その日付は無効です、と断ってきました。
なのに手元の終了コードは0。予約は1件も入ってません。
理由は型1と同じ筋です。命令を送る側の処理は送れたかどうかまでしか見てへん。相手が断ったかは、返ってきた中身を読まんと分かりません。送信そのものは成功しとるので、0を返すのは処理としては正しいわけです。
なので今は、0を成功の証拠にせんようにしました。予約しましたの行と、公開予定の時刻がちゃんと出とるかで判定する。数字やなくて中身のほうです。
型3|壊す方向の操作も、きれいに0で終わる
3つ目は、台帳のファイルに1行足そうとした時。書き込むコマンドの中に記号の使い方を間違えた部分があって、入れたかった文字の一部が消えた状態で着弾しました。同じ日に2回やっとります。
この時も0。書き込み自体は成功しとるからです。何を書いたかが正しいかどうかは、書く側は知りません。
これがいちばんタチ悪いと思いました。型1と型2はやったはずのことがやれてへんですが、型3はやったらあかんことが済んでしまっとる。しかも成功と表示される。
ここも直し方は同じで、書いた直後に書いた先を読み返す。入れたはずの文字がほんまに入っとるかを見る。それだけです。
並べてみたら、0の出どころが全部ズレとった

並べてみたら同じ形でした。0を出した主体が、こっちが知りたい仕事の主体と違う。
- 型1で知りたかったのは検算が合ったかどうか。出た0は切り出す処理の成績
- 型2で知りたかったのは予約が入ったかどうか。出た0は送信する処理の成績
- 型3で知りたかったのは中身が正しいかどうか。出た0は書き込む処理の成績
どれも、その処理自身は嘘をついてません。自分の仕事はちゃんとやったと言うとるだけ。じゃあ全体もOKやな、と勝手に読んだのはこっちです。
なので今は、0が出た時に一回止まってこれは誰が出した0なんかを言えるかを確かめてます。言えんかったら、合図やなくて成果物を見る。検算やったらファイル、予約やったら予定時刻、書き込みやったら書いた先。
ちなみに0以外が出た時は信用してええです。失敗を名乗ってきとるものはだいたい本物。疑うのは0の側だけで足ります。
よくある質問
終了コードを見るのはやめたほうがいいですか
やめる必要はないです。0以外が出た時は本物の失敗なので、そのまま信用できます。危ないのは0の側だけ。その0を出した処理が、自分の知りたい仕事と同じかどうかを見る。それで足ります。
AIに自動化を作らせる時、どう頼めば防げますか
2つ言うとくと違います。出力を短くする処理を後ろにつなぐ時は元の終了コードが消えん形にすること、それと、成功と判定する条件を返ってきた中身のほうで書くこと。頼まんかったら、たいてい0だけ見る形で出てきます。
毎回そこまで確認するのは大変ちゃいますか
全部にはやってません。やり直しの効かんものと、外に出るものだけ成果物まで見るようにしとります。それ以外は、誰が出した0か言えたらそのまま進めてます。疲れる確認は続かんので、対象を絞ったほうが結局残ります。
あわせて読みたい
- テストが通っても本番で落ちる|緑を信じて1日分飛ばした|あっちは検査が見に行く道が本番と違った話。こっちは検査は正しく落ちとるのに結果が届かん話
- 自作ツールのエラーを4日流した話|理由をつけて納得する癖|出とる警告に自分で理由をつけて黙らせとった話