在C#中没有异常跳出“try”块是否有“干净”的方法

时间:2011-12-20 06:45:19

标签: 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
        });

如果用户点击取消按钮,那么我有代码(此处标记为&lt; - xxxx)重定向到某个动作。此代码与try块之后的代码相同。有没有办法让我的代码退出try。我能想到的唯一方法是触发一个异常,我想要一个干净的跳转,而不是一个使用异常的方法,因为用户单击取消不是错误。

3 个答案:

答案 0 :(得分:5)

切换if块条件:

// 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
});

答案 1 :(得分:3)

有一种方法可以手动退出try catch (带有goto声明),但这是一种可怕的OO练习,应该避免使用。< / p>

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
           });  
}

答案 2 :(得分:1)

我知道它不是最好的编程关键字,但是goto可以完成这项工作

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
        });