新しいものを表示
orange さんがブースト

で、狂人に「あなたは狂人ですか?」と尋ねるのは根本的に作りがおかしくて、『わたし』の側で「こいつ狂人じゃん!」と気付くのは常に『わたし』側で実装された処理の責任

スレッドを表示
orange さんがブースト

blog.cardina1.red/2019/12/19/d

> つまり、プログラムが不整合状態になったとき、プログラムは全体として既に想定を満たさない状態で動いている可能性があり、その結果として発生する処理やデータも基本的に無意味である[6]。 その無意味な処理で無意味なデータを解釈して「復帰」しようとする行為も、当然無意味である。

スレッドを表示
orange さんがブースト

他人が狂人だったらオメーが自衛しろ、自分が狂人かもしれなかったら死ね、と言っています (言葉が悪い)

微妙に納得いかない><;
狂人に「狂っているか?」と聞いてまともな返事が得られると期待すべきでは無いかも><
多重チェック出来るのであればすべきかも><
そこまでの手間をかけられるのであれば、あるセクションが(理由を問わず)実行不可能だった場合を想定するように書く手間を惜しむのは謎かも><

orange さんがブースト

あと読もうとしているデータのスキーマ次第

スレッドを表示
orange さんがブースト

見分けがつかない場合もあるでしょうし、あるいは正しく設計すればそもそもそんなことが起き得ない書き方もできるでしょうね。それは言語の表現力とユーザの設計次第。

orange さんがブースト

blog.cardina1.red/2019/12/19/d

端的にはコレです

> * プログラムが完全に掌握しているはずのデータが誤っていれば、 panic せよ
> * プログラムのバグが原因なら、 panic せよ
> * 環境や外部データに問題があるなら Result を返すべし
> * エンドユーザに問題があるなら Result を返すべし
> * ありえないことが起きたなら panic せよ

スレッドを表示

検出可能かというかファイル内容の不整合と見分けがつくのかが謎かも・・・><

orange さんがブースト

たとえばですが、
「jsonファイルがフィールド a と b を持っている」
という想定があったとして、「a や b がなかったり余計な c があったりするファイルを読んだ」は「想定可能なエラー」なんですよ。この場合クラッシュすべきでない。

で、じゃあどういう場合にクラッシュすべきかというと、
「json ファイルがフィールド a と b を持っていてそれを読んだのに、返すオブジェクトで a の値を設定し忘れた」とかそういう「デシリアライザが仕様違反を犯している場合」です。
この場合「デシリアライザが『こういうデータを読みますよ』と (仕様で暗黙に) 表明したデータ以外を返す」というのは仕様外動作なので、そこから復帰しようとすべきでない。

orange さんがブースト
orange さんがブースト

ファイル等の読み込みの場面は、ファイルが正しいフォーマットである事に期待する事自体が危険だと思うかも・・・><

なんでファイル等の読み込みの場面でオレンジが神経質に考えるかというと、そこが型付けの場面で静的な型に収まっている世界と収まっていない世界の境界になるので、静的に型付けされていない側は徹底的に疑って期待しないかも><

ファイル等の読み込みの場面は、ファイルが正しいフォーマットである事に期待する事自体が危険だと思うかも・・・><

orange さんがブースト

それは単に仕様の問題で、もちろん「実装のバグも仕様として想定されたエラーと見做す」という仕様にしてもいいんですよ、そのコストが本当に得られるものに釣り合うなら。

その処理を中止するのとアプリがクラッシュするのは全然違う事かも><(UNIX文化圏では同じになっちゃうのかもしれないけど)

オレンジ的には不整合を見つけた場合にはユーザーに知らせるべきではある一方でクラッシュするべきでは無いと考えるかも><
たぶんそのアプリの実行してる時間の差で意識が違うんだと思う><
CLI中心の人にとってはUNIX哲学の通りひとつの事しかさせないのでクラッシュ自体を重大とは捉えないかも><
GUI中心の発想や失敗したら人が死ぬ分野の発想では、クラッシュして止まること自体を重大に考えるので、クラッシュさせるのは最後の最後の手段と考えるかも><
(失敗したら人が死ぬ分野の場合は、なんらかの(例えば物理的な)更なるバックアップがない状況ではそもそもクラッシュさせるという選択肢はとらないかも><)

orange さんがブースト

私が言いたいのは

* I/O エラーは想定可能であり、常に復帰や適切なエラーハンドリングを試みるべき
* 逆に内部的な不整合や実装自体の仕様違反を原因とする問題に気付いたら、速やかに明示的なクラッシュをするべき
* バグは「エラー」ではない
* 不注意や人間のキャパを越えたエラー仕様で例外をキャッチし損ねてクラッシュするのは言語仕様が駄目

あたりです

スレッドを表示
orange さんがブースト

「エラーが値である Rust ではメソッドチェーンや通常の関数でエラーからの復帰を書けるのに対して、例外が戻り値型と別の存在になっている言語では構文レベルで特殊な扱いが必要になる」というエラーハンドリングの言語由来の複雑性の違いを例示したかったやつです

スレッドを表示
orange さんがブースト
orange さんがブースト

これ <mastodon.cardina1.red/@lo48576> のことを言ってるのなら、これはマジで単なる例で、 <mastodon.cardina1.red/@lo48576> と対比しただけです (I/O エラーを問答無用で無視する実装が正しいかは別の問題)

古いものを表示
:realtek:

思考の /dev/null