たとえばあなたは C++ 標準ライブラリのあらゆるバグを想定して検査をかけますかと。まあ普通はかけない。
何故検査をかけないかというと、ライブラリが仕様通りに動作すると暗黙に信用していて、かつライブラリが狂っているときは自分も狂っていることになるという一連托生状態を受け入れているから。
> つまり、プログラムが不整合状態になったとき、プログラムは全体として既に想定を満たさない状態で動いている可能性があり、その結果として発生する処理やデータも基本的に無意味である[6]。 その無意味な処理で無意味なデータを解釈して「復帰」しようとする行為も、当然無意味である。
https://blog.cardina1.red/2019/12/19/dont-fear-the-panic/#additional-topics--still-wondering
端的にはコレです
> * プログラムが完全に掌握しているはずのデータが誤っていれば、 panic せよ
> * プログラムのバグが原因なら、 panic せよ
> * 環境や外部データに問題があるなら Result を返すべし
> * エンドユーザに問題があるなら Result を返すべし
> * ありえないことが起きたなら panic せよ
たとえばですが、
「jsonファイルがフィールド a と b を持っている」
という想定があったとして、「a や b がなかったり余計な c があったりするファイルを読んだ」は「想定可能なエラー」なんですよ。この場合クラッシュすべきでない。
で、じゃあどういう場合にクラッシュすべきかというと、
「json ファイルがフィールド a と b を持っていてそれを読んだのに、返すオブジェクトで a の値を設定し忘れた」とかそういう「デシリアライザが仕様違反を犯している場合」です。
この場合「デシリアライザが『こういうデータを読みますよ』と (仕様で暗黙に) 表明したデータ以外を返す」というのは仕様外動作なので、そこから復帰しようとすべきでない。