2016-12-04 3 views
1

この質問は、設計とクリーンコードの詳細です。チェックされたexpectionがスローされるべきとき、またはnull値を返してチェックする必要があるときこの値がnullの場合はクライアント上でユーザセッションの期限が切れたとき、またはnullを返すときに例外をスローする

例外的な状況が発生する可能性がありますが、私たちはそれを防ぐことはできません。また私は、制御フローとして例外を使用すべきではないことを読んだ。

私の場合、多くのユーザーがリクエストを行い、ユーザーセッションが期限切れになっているかどうかを確認する方法があります(そして10分後に期限が切れます)。私はこの状況を防ぐことができないので、私はそこで例外をスローする必要がありますが、その状況が10分ごとに発生する場合、反対側では例外が高価ですし、nullを返して、クライアントはパフォーマンスの点で優れています。この場合、あなたは何をしますか?

これは私の方法である:

@Override 
public Integer getUserIdBySessionKey(String sessionKey) { 
    User user = userSessions.get(sessionKey); 
    boolean isUserSessionValid = isUserSessionValid(user); 
    return isUserSessionValid ? user.getUserId() : null; 
} 
+1

*ユーザーセッションが期限切れであるかどうかを確認する方法があります。*:セッションが期限切れの場合はtrueを返し、そうでない場合はfalseを返します。私はあなたの方法が実際にそれをしないと思います。それを記述するのではなく、コードを投稿してください。 –

+0

@JBニジェット、されています。私の質問は、これまでのところnullが返されますセッションは有効ではありませんが、私は "ExpiredSessionException"をスローする可能性があります、多分1つのオプションか別のオプションの間で選択する大きな問題ではないが、私は最もきれいに可能な場合 – fgonzalez

+1

このケースから呼び出しコードが復旧する可能性がある場合は、オプションを返します。一方、呼び出し側コードがこのケースを処理すべきではなく、セッションが無効なときにグローバル例外ハンドラを呼び出すだけの場合は、実行時例外がスローされます。いずれにせよ、私はチェック例外をスローしません。 –

答えて

3

あなたは、呼び出し元のコードに考慮に入れなければならない重要な例外的な状況を通知したいときは、チェック例外を使用する必要があり、そしてそのために意味のあるアクションが可能撮影。たとえば、ユーザーを認証する場合、パスワードが間違っているか、アカウントが期限切れになっているため、確認済みのAuthenticationExceptionまたはAccountExpiredExceptionが妥当である可能性があります。クライアントコードはこれらの例外をキャッチし、それらを適切に処理します。

一方、妥当な措置が取られていない場合や、一般的な方法で処理できるほど一般的である場合は、チェックされていない例外があります。すべてのコーディングエラー(NullPointerException、IllegalStateException、データベースエラー、ネットワークエラーなど)はこのカテゴリに分類されます。

問題は、呼び出しコードがセッションの期限切れについて何かすることを期待していますか?このような例外を捕捉してログインページにリダイレクトするこのような状況(たとえばトップレベルのServletFilterなど)を処理するための一般的なメカニズムがある場合は、未確認の例外にします。これに呼び出しコードから特に注意が必要な場合は、チェックします。

あなたの場合、私はチェックを外し、トップレベルで一般的な方法で処理します。

+0

さて、クライアント側からは、クライアントに適切なhttpエラー(この場合は400 Unathorized)を返すために、どのような種類の例外があるかを知る必要があります。実行時の例外を使用してそれを行うと、例外間を区別できません。この場合、チェックされたexpcetionはうまく収まるでしょうが、expcetionを送信する代わりに、オプションのを返し、クライアントでチェックを行います(省略可能です.isPresentがHttp.Unathorizedを返す場合)。 – fgonzalez

+1

RuntimeExceptionを継承するSessionExpiredExceptionを作成できます。これにより、トップレベルで適切にキャッチして(400を返すことによって)処理できるチェックされていない例外になります。チェック例外を作成する必要はありません。 – Lucian

+1

そして、ヌルやステータスコードを返すことは、例外的な状況を処理するJavaの方法ではありません。これはC(または例外処理機構を持たない他の言語)では適切ですが、Javaではそうではありません。 – Lucian

関連する問題