エラー握りつぶしって?
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を投げてログを残そうとすると、
ユーザーがとにかくエラーを起こす送信を何回も投げることで、
ログがたくさん・・・どこにほしいログがあるかとかわからなくなったり、
メール送信とかしてたら負荷がかかったりとか、いろいろ辛いことに(´;ω;`)
なので、バグやデータベースがおかしい時にログを残す必要は間違いなくありますが、
それ以外の場合は、ログを残すべきか慎重に考えましょう。
こういったエラーの設計は、ベストプラクティスとかを知らないので、
ご存知の方いらっしゃいましたら、教えていただきたいです。
それまでは、アンチパターンをたくさん覚えて、備えるようにしましょう・・・!