switch文において指定されたケースが処理できない場合に例外を発生させる方法
質問
MVCアプリのシステムで、あるユーザーのパスワードを変更する関数があるとします。
public JsonResult ChangePassword
(string username, string currentPassword, string newPassword)
{
switch (this.membershipService.ValidateLogin(username, currentPassword))
{
case UserValidationResult.BasUsername:
case UserValidationResult.BadPassword:
// abort: return JsonResult with localized error message
// for invalid username/pass combo.
case UserValidationResult.TrialExpired
// abort: return JsonResult with localized error message
// that user cannot login because their trial period has expired
case UserValidationResult.Success:
break;
}
// NOW change password now that user is validated
}
membershipService.ValidateLogin()
は
UserValidationResult
と定義された enum を返します。
enum UserValidationResult
{
BadUsername,
BadPassword,
TrialExpired,
Success
}
守備範囲の広いプログラマである私なら、上記の
ChangePassword()
メソッドを変更して、認識されない
UserValidationResult
から戻ってきた値が
ValidateLogin()
:
public JsonResult ChangePassword
(string username, string currentPassword, string newPassword)
{
switch (this.membershipService.ValidateLogin(username, currentPassword))
{
case UserValidationResult.BasUsername:
case UserValidationResult.BadPassword:
// abort: return JsonResult with localized error message
// for invalid username/pass combo.
case UserValidationResult.TrialExpired
// abort: return JsonResult with localized error message
// that user cannot login because their trial period has expired
case UserValidationResult.Success:
break;
default:
throw new NotImplementedException
("Unrecognized UserValidationResult value.");
// or NotSupportedException()
break;
}
// Change password now that user is validated
}
私はいつも、上記の最後のスニペットのようなパターンをベストプラクティスだと考えています。たとえば、ある開発者が、ユーザーがログインしようとしたときに、これこれのビジネス上の理由がある場合は、まずビジネスに連絡するようにという要件を得たとしたらどうでしょうか。そこで
UserValidationResult
の定義が更新され、次のようになります。
enum UserValidationResult
{
BadUsername,
BadPassword,
TrialExpired,
ContactUs,
Success
}
開発者は
ValidateLogin()
メソッドを変更して、新しい列挙型の値を返すようにします (
UserValidationResult.ContactUs
) を返しますが
ChangePassword()
. スイッチに例外がなければ、そもそもログインの試みが検証されるべきでないのに、ユーザーはまだパスワードを変更することが許されているのです!
私だけでしょうか、それともこの
default: throw new Exception()
は良いアイデアだと思いますか?私は何年か前にそれを見て、いつも(それを理解した後)それがベストプラクティスであると仮定しています。
どのように解決するのですか?
この場合、私はいつも例外を投げています。そこで
InvalidEnumArgumentException
を使うことを検討してください。
関連
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み】1つのswitch case文に2つの値を使用する場合
-
[解決済み】コンストラクターからの例外のスローイング
-
[解決済み】デストラクタで例外を投げてはいけない場合、その中のエラーはどのように処理するのでしょうか?
-
[解決済み】switch文は常にdefault句を含むべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] C#のenum内部のメソッド