エラー握りつぶしって?
try { $value = $array[$key]; } catch (Exception $e) { $value = 1; }
この時、$keyは、普通のユーザーの入力ではありえない値を取る時、
本来はエラーを出してほしいです。
例えば、バグやサーバーが壊れているときにExceptionが投げられると思います。
もし、そうしなかった場合・・・バグが起こっているのに、全く気が付かない。
苦しいですよ・・・一度味わうとエラー握りつぶしは二度としたくないって思います。
if文でエラー握りつぶし?
if ($key === self::TYPE_A) { $value = $array[$key]; } elseif ($key === self::TYPE_B) { $value = $array[$key] + 1; } else { $value = 1; }
Exceptionに限らず、
$keyがユーザー入力ではありえないことが起こっていたら、これも実質エラー握りつぶしとも言えると思います
バグやサーバーが壊れているときに、気づけないのは同じですから・・・
if else文を書く時にも、これはエラー握りつぶしてないか?バグ起こっても気づけるか?
その意識を少しするだけでも、後の自分の負担が軽くなります!
余談:エラーをどうしても出してほしくない
例外を出すべき時に、Exceptionがどうしても起こってほしくない。
それなら、せめて、ログを・・・ってことで、こんな感じに。
try { $value = $array[$key]; } catch (Exception $e) { Log::error($e . 'DBやばいことなってるかも'); $value = 1; }
これで、一応エラーの検知は出来ますね。
さらに余談:エラーログ出力攻撃
上の例で、Exceptionを投げる時ですが、
$keyは『ユーザーが想定している正しい値以外を行った時』という観点だと、
『エラーログ出力攻撃』みたいなことが起こってしまうかもしれません。
例えば、ブラウザをいじって送信した時や、curlなどで任意の値を渡すなど、
わざと想定外の値を送ることも、ユーザーは可能です。
その、わざと想定外の値に対してExceptionを投げてログを残そうとすると、
ユーザーがとにかくエラーを起こす送信を何回も投げることで、
ログがたくさん・・・どこにほしいログがあるかとかわからなくなったり、
メール送信とかしてたら負荷がかかったりとか、いろいろ辛いことに(´;ω;`)
なので、バグやデータベースがおかしい時にログを残す必要は間違いなくありますが、
それ以外の場合は、ログを残すべきか慎重に考えましょう。
こういったエラーの設計は、ベストプラクティスとかを知らないので、
ご存知の方いらっしゃいましたら、教えていただきたいです。
それまでは、アンチパターンをたくさん覚えて、備えるようにしましょう・・・!