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

「ネットワーク越しに不正なデータが来た」は「予期した形式でないことを検出した」に入るべきで (つまり「不正なデータをロード時に検査するべき」を含意する)、その場合クラッシュするのはおかしい

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

これは単に語法の問題で、

「ローレベル I/O の失敗でクラッシュすべきでない」
「データを読もうとして予期した形式でないことを検出したときクラッシュすべきでない」
「デシリアライザが仕様と食い違うデータを正常だと認識して読んでしまうのはユーザに責任のない実装のバグであり、速やかにクラッシュすべき」

あたりです (全部両立する)

想定外の状況ではクラッシュするけどIO関連のエラーの場合にはサイレントにデフォルト値を読むって奇妙すぎる実装では?><
もし、例えば設定ファイルかなんかでファイルが作られていない状況のみを想定してるとしたら、しっかりあらかじめファイルの存在を確認すべきであるし、手抜きせず『設定ファイルが無い例外』を別に定義してそれを投げるべきでは?><

だとしたらIO由来のエラーでもクラッシュすべきでしょ?><

orange さんがブースト

や、言い方が悪かったかもしれないけど私はクラッシュするべきでないとは最初から主張してないんです、過去こんな記事も書いたように……

Panic を恐れるべからず - 何とは言わない天然水飲みたさ
blog.cardina1.red/2019/12/19/d

orange さんがブースト

それはユーザに責任のないバグで invariant の破壊なのでさっさとクラッシュするべき、むしろその場合は逆に復帰を試みるべきでない

そもそもload_fooが成功しちゃってなおかつ必要なデータがjsonファイルに記述されていなかった場合、または必要な項目が記述されていなかった場合に例外を吐くようにload_fooが書かれていた場合どうするのか謎><

例外握りつぶしまくり書けばよいと言いたいんじゃなく、もっとちゃんと安全優先に書く方がよくね?><
って言いたい><
mstdn.nere9.help/@orange_in_sp

jsonにあるデータを読みなおかつデフォルト値があるようなものであれば、ファイルシステムのエラーと、jsonとして読めるか?のエラーと、jsonの中のデータとアプリ側が想定する型等と不整合があるか無いか? の3つかも?><
その上で、読めなければ握りつぶしてデフォルト値で済ませられる程度のものであれば、例で言う所のjsonのファイル名渡してる関数にデフォルト値を渡したり、先にデフォルト値を書いておいてその関数内で例外全て握りつぶせばよくね?><

orange さんがブースト

いやべつに low-level I/O error と invalid data を区別してもしなくてもいいんですが (それはエラー型の設計次第)、区別したところで catch すべき例外が2種類に増えるだけで話の本質にはあまり影響しないので

なんでIO関連のエラーとファイルの中身が想定外になっている事への対処がまぜこぜっぽい話になってるのか謎・・・><

オレンジが書く場合はまずデフォルト値で初期化してからそこに上書きでファイルから読んだ情報を書いていくようにするかも><

orange さんがブースト

ここで

v = null;
if(auto w = load_foo("foo.json")) {
v = w;
} else {
v = default_foo();
}

みたいなのとか

v = null;
try {
v = load_foo("foo.json");
} catch (IoException e) {
v = Foo.default();
}

みたいな書き方をしないといけないの、そりゃプログラマが雑にエラーを扱おうとするのも致し方なしみたいな感じになってくるし、それって言語側が「正しいことを書きやすく、正しくないことを書きづらく」のデザインに失敗しているというだけの話なのではと

スレッドを表示

デコードしてしっかり型つけして読み込む(?)って話なのか、読み込み時のIOのエラーの話なのかさっぱりわからない・・・・><

逆にこういう風にしないで互換性どうやって保つのか謎><

スレッドを表示

そもそも、実行時に何らかのファイル等のデータをデコードする最中に記述されているデータの不整合を見つけた場面にでは、そのシステム標準の例外のシステム等を頼るべきでは無い気がする派><
期待しないというか、ファイルは壊れてて当たり前的な><

オレンジはデコーダというかパーサというか何らかのフォーマットな文字列でデータを読み書きするやつを作る時には、
既知の項目のはデコードするけど記述が無ければ無いとする(必ずあるとは期待しない)、未知の項目は読み飛ばして例外は出さず、未知のデータがあったという情報のみ残す(単にスルーの場合もある)、
ってしてるので実行時に例外だしてコケる事まず無いかも><

orange さんがブースト

たとえば Rust で「load_foo("foo.json") が失敗したらデフォルトの値とする」とかだと

load_foo("foo.json").unwrap_or(Default::default)

みたいな感じでごく普通のメソッド呼び出しで済むので、例外が伝播されるとか catch すると実行が分岐して代入文が2つに増えるとかそういうのがないんですよね。欲しい挙動を書くだけという……

ほのぼの動物ニュース><(バランス><;)

"食事中に突然フリーズ ムササビくんに何があった?(2021年1月28日)" を YouTube で見る youtu.be/wduRsozqj0I

古いものを表示
:realtek:

思考の /dev/null