画像を2枚まとめてアップする処理を走らせました。1枚目は通って、2枚目でサーバーに弾かれた。まあ、ようある話です。
ところが後から見たら、成功したはずの1枚目も、どこにも残ってへんかった。上がったのは事実やのに、上がった証拠だけが消えとった。
2枚まとめて上げて、1枚目だけ通った
記事に貼る画像をサイトへ上げる、そういう自作の処理があります。ファイル名を並べて渡すと、1枚ずつ順番に上げていく作りです。
その日は2枚渡しました。1枚目は上がった表示が出た。2枚目でサーバーが受け取りを拒否しました。
拒否された理由の方は今回の本題やないので置いときます。問題はその後です。
上がった1枚が、無かったことになる

上げた画像は、次の工程で使うために置き場所を控えるようになってます。次の処理がその控えを読んで、続きをやる。
で、その控えを書く部分が全部終わった後に置いてありました。2枚目で失敗した時点で処理は打ち切り。控えを書く行までは一度も届かんかった。
1枚目はサイトに実在しとるのに、こっちの手元には何も残ってへん。使えるのに、使う手段が無い状態です。
しかもこの処理、同じファイルの上の方に「途中で落ちて半分だけ上がる状態は作らん」とコメントが書いてありました。書いたのは自分です。
実際に守っとったのは、走らせる前に「ファイルが全部あるか」を確かめる部分だけ。ファイルが無いせいで途中で止まるのは防げます。でもサーバーに弾かれるのは防げん。約束の方が、実装より大きいこと言うとったわけです。
直した初回で、また落ちた
直し方自体は簡単でした。失敗して打ち切る直前にも、そこまでの分を控える。数行足すだけです。
で、走らせたらまた落ちました。今度は別の理由で。
控えの置き場所を書いた行が、画像を上げる部分より下にあったんです。プログラムは上から順に読むので、下に書いてあるもんは、上から呼ばれた時点ではまだ用意できてへん扱いになる。前は一番最後にしか呼んでへんかったから問題なかった。途中から呼ぶようにした瞬間、順番が合わんくなりました。
行を上へ動かして解決。ただ動かして満足して、走らせてへんかったら、直したつもりで終わっとった。タチが悪いのは、この落ち方が失敗した時にしか出てこんことです。全部うまくいく回は今までどおり通る。控えを残したかったのは、まさに途中で落ちた時やのに。
記録は、成果が出た直後に書く
今回で頭に置いとくことにしたのが2つあります。
ひとつは部分的な成功は、放っといたら失敗として丸ごと捨てられること。人間は「2枚のうち1枚は上がったな」と数えるけど、機械はそう数えてくれん。エラーが出た、はい全部無かったこと、で終わります。
もうひとつは記録をまとめて最後に書かんこと。成果が出た直後に書く。最後にまとめる形は、途中で落ちた時に全部持っていかれます。
ひとつだけ設計が効いとった部分もあって、次の工程が「控えに置き場所が無い」でちゃんと止まってくれました。無いもんを想像で埋めてまうのが一番アカンやつなので、そこは止まってくれて助かった。
あわせて読みたい
近い系統の失敗を、前にも2本書いてます。落としたら戻せなかった話|自作ツールの取り消し設計/テストが通っても本番で落ちる|緑を信じて1日分飛ばした