エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

if文でもエラーの握りつぶし、やってませんか?【503日目】

エラー握りつぶしって?

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を投げてログを残そうとすると、
ユーザーがとにかくエラーを起こす送信を何回も投げることで、
ログがたくさん・・・どこにほしいログがあるかとかわからなくなったり、
メール送信とかしてたら負荷がかかったりとか、いろいろ辛いことに(´;ω;`)

なので、バグやデータベースがおかしい時にログを残す必要は間違いなくありますが、
それ以外の場合は、ログを残すべきか慎重に考えましょう。

こういったエラーの設計は、ベストプラクティスとかを知らないので、
ご存知の方いらっしゃいましたら、教えていただきたいです。
それまでは、アンチパターンをたくさん覚えて、備えるようにしましょう・・・!