ASP.NET MVC2 - try / catch(throw?)块的数量和位置

时间:2010-09-15 17:34:07

标签: c# asp.net-mvc-2 error-handling

我正在整个异常处理丛林中挣扎,我现在正试图确定我需要多少个try / catch块,以及放置它们的位置。

我的控制器

CreateInvitation(fromUser, toUser);

调用我的BLL方法

public static Invitation CreateInvitaton(User fromUser, User toUser)
{
    try
    {// see if toUser exists, then create the invitation}
    catch
    {// throw something, maybe?}
}

我真的需要在该方法中重新抛出它吗?即使我没有重新扔它,它也不会重新回到堆叠中吗?

我是否需要将控制器的调用包装在try / catch块中,或者是多余的?

也许我根本不需要BLL方法中的try / catch块,只需要在我的控制器中使用try / catch块?

我在这里看了很多可能的组合,并且不知道正确的组合是什么。

感谢。

2 个答案:

答案 0 :(得分:2)

在您的示例中编写的异常处理程序绝对没有做任何事情。 (好吧,它浪费了一点时间,但它没有任何用处)

原来是:

try 
{...} 
catch 
{ 
  // do something here.
   throw;
} 

然后是try / catch&扔掉将是必要的。

答案 1 :(得分:1)

在本地捕获例外,当且仅当它们表明例外行为可以在本地修复(或评论)时。

很难找到一个例子 - 这里是一个:我有一些需要悲观锁的对象。需要锁定是因为从Web应用程序写入对象而另一个(后台)应用程序正在读取它可能会导致灾难。这确实是一个例外,因为它很少会发生。而且,我事先无能为力(因为锁可能是在下一行执行之前获得的)。但是,我可以在几个msecs中重试,因为我知道对象再次释放的机会很好。尽管如此,所有这一切都不会发生在控制器中,而是发生在服务类中。

不要对预期条件使用例外(例如,无效输入)。

此外,我同意除了记录消息(应该在控制器中完成)和发送错误页面之外,无法处理Web应用程序中的大多数异常。最后,在捕获异常时,请确保正确执行(捕获特定的异常类型,使用throw;而不是throw ex;进行转发)