2011-12-20 9 views
2

次のコードがあります。アクションにリダイレクト - ユーザーがキャンセルボタンをヒットした場合"try"ブロックから飛び出す "クリーン"な方法はありますか?C#で例外を除いて

 try 
     { 
      if (vm.SubmitAction == "Cancel") 
       return RedirectToAction("ShowSummary", new 
       { 
        ds = vm.Meta.DataSourceID 
       }); <------------------------------------------- xxxx 
      _account.ValidateNoDuplicate(vm.Account); 
      vm.Account.Modified = DateTime.Now; 
      vm.Account.ModifiedBy = User.Identity.Name; 
      _account.AddOrUpdate(vm.Account); 
     } 
     catch (Exception e) { 
      log(e); return View("CreateEdit", vm); 
     } 
     return RedirectToAction("ShowSummary", new { 
      ds = vm.Meta.DataSourceID 
     }); 

私は(xxxxは<とここにマーク)のコードを持っています。このコードはtryブロックの後のコードと同じです。私のコードがtryから抜けるようにする方法はありますか?私が考えることができる唯一の方法は、例外をトリガすることであり、ユーザがキャンセルをクリックする際のエラーではないので、例外を使用するものではなくクリーンなジャンプが必要です。

+0

きれいに終了するとどういう意味ですか?コードはメソッド呼び出しの結果を返しています。メソッドが例外を呼び出さない限り、コードは呼び出しの実行後にreturnを介してtryブロックから終了します。 –

+0

このコードでは、3つの方法でも匂いがします:1) 'DateTime.Now'は現地時間を使用します。すなわち「DateTime.UtcNow」。 2)メソッドのサービスまたはパラメータである必要があります。それは静的であり、それは変わって、悪い組み合わせです。 3)あなたはキャッチオールです。通常は、ローカルで特定の例外を捕捉し、トップレベルのハンドラでは一般的な例外を捕捉します。 – CodesInChaos

答えて

5

スイッチ周りの場合はブロック条件:

// happens only when not cancelled 
if (vm.SubmitAction != "Cancel") 
    try { 
    _account.ValidateNoDuplicate(vm.Account); 
    vm.Account.Modified = DateTime.Now; 
    vm.Account.ModifiedBy = User.Identity.Name; 
    _account.AddOrUpdate(vm.Account); 
    } 
    catch (Exception e) { 
     log(e); return View("CreateEdit", vm); 
    } 

// happens always 
return RedirectToAction("ShowSummary", new { 
     ds = vm.Meta.DataSourceID 
}); 
+0

これは動作が非常に微妙に変化しています。元のコードで 'vm'がnullだった場合、' NullReferenceException'が捕捉されます。このコードでは、そうではありません。これをOPに指摘してください。最初にnullをテストするために条件を変更したいことがあります。 – Amy

+2

@Inuyasha:Null参照例外は決して捕まえてはならないので、このバージョンは*より良い*です。 null参照例外は決してスローされるべきではないので、null参照例外は捕捉されるべきではありません。すべてのnull参照例外は、不可能にするために修正する必要があるバグであり、例外ではありません。 –

+0

@エリック - この文脈で私はあなたが正しいと思いますが、より広範に適用されると、あなたのステートメントが強く言い表されると思います。場合によっては、バグのある第三者コード(バグ修正に力を入れていない)に頼っているかもしれないので、NREをキャッチするのは悪い選択肢の1つかもしれません。 – kvb

3

あり(goto文で)手動をtrycatchを終了する方法があるが、それはひどいOOの練習だと避けるべきです。

は方法にあなたのRedirectToActionロジックをカプセル化し、それを呼び出す:

try 
{ 
    if (vm.SubmitAction == "Cancel") 
     return ShowSummary(vm); 
    _account.ValidateNoDuplicate(vm.Account); 
    vm.Account.Modified = DateTime.Now; 
    vm.Account.ModifiedBy = User.Identity.Name; 
    _account.AddOrUpdate(vm.Account); 
} 
catch (Exception e) { 
    log(e); 
    return View("CreateEdit", vm); 
} 
return ShowSummary(vm); 

と方法:

private ActionResult ShowSummary(MyViewModel vm) 
{ 
    return RedirectToAction("ShowSummary", new 
      { 
       ds = vm.Meta.DataSourceID 
      }); 
} 
+0

'goto'文を使ってtryブロックを終了できます。 OmarQaの答えを見てください。 – Amy

+0

私はそれを無視することを好むと言いましょう。 Btwは「きれいな」方法を言います。更新いただきありがとうございます。 –

+0

無視することをお勧めしますそれは存在しないということとは異なります。それは存在する。それは誤っていることを彼に伝えるためにOPを不快にしている。 – Amy

1

私はそれを知っているが最高のプログラミングのキーワードではありませんが、仕事をやります。

try 
    { 
     if (vm.SubmitAction == "Cancel") 
      goto ShowSummary; 

     _account.ValidateNoDuplicate(vm.Account); 
     vm.Account.Modified = DateTime.Now; 
     vm.Account.ModifiedBy = User.Identity.Name; 
     _account.AddOrUpdate(vm.Account); 
    } 
    catch (Exception e) 
    { 
     log(e); return View("CreateEdit", vm); 
    } 
ShowSummary: 
    return RedirectToAction("ShowSummary", new 
     { 
      ds = vm.Meta.DataSourceID 
     }); 
関連する問題