プログラム全般的な書き方について質問させてください。
「ログインチェック」と「バリデーションチェック」のエラー処理を
try-catchで処理する場合、どういう風に書くのが一般的なのでしょうか?

案1.try-catchをそれぞれのチェックに分ける。

try{
    /* ログインチェック */
    throw new Exception('ログインエラー!');
} catch (Exception $e) {
    /* ログインチェックのエラー処理 */
}
try{
    /* バリデーションチェック */
    throw new Exception('バリデーションエラー!');
} catch (Exception $e) {
    /* バリデーションチェックのエラー処理 */
}

案2.Exceptionを拡張する。

try{
    /* ログインチェック */
    throw new LoginException('ログインエラー!');
    /* バリデーションチェック */
    throw new ValidationException('バリデーションエラー!');
} catch (LoginException $e) {
    /* ログインチェックのエラー処理 */
} catch (ValidationException $e) {
    /* バリデーションチェックのエラー処理 */
}

↓のメリットを考慮しても個人的には案2だと思っているのですが、
他にも書き方がある等教えて頂ければor意見を頂ければ幸いです。

案1.
メリット:例外を拡張しなくても良い(楽に書ける)。
デメリット:可読性が悪い(見づらい)。
案2.
メリット:可読性が良い。
デメリット:例外を拡張する必要がある。
拡張する数が増えた場合は収拾がつかなくなる可能性がある?