【问题标题】:ASP.NET MVC2 - number and location of try/catch(throw?) blocksASP.NET MVC2 - try/catch(throw?) 块的数量和位置
【发布时间】:2010-09-15 17:34:07
【问题描述】:

我正在翻遍整个异常处理丛林,我现在正试图确定我需要多少 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 块?

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    如您的示例中所写,异常处理程序完全没有做任何事情。 (嗯,这有点浪费时间,但没有任何用处)

    曾经:

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

    那么就需要 try/catch & throw。

    【讨论】:

    • +1。对此进行扩展:除非您需要在异常消息中添加有意义的内容,否则不要使用 try/catch。 99% 的情况下,您应该允许异常一直冒泡到您的默认错误页面,并使用 ELMAH 之类的内容进行记录。
    • 谢谢。我只是将那个 shell 用作更多的占位符来指示我正在考虑将它放在哪里。
    • 好的,放弃 BLL 的 try/catch 块,看看我的控制器中是否有任何错误?
    • 不,你没有。您应该验证输入,以免出现预期异常,并让您的错误处理程序处理其余部分。
    • @Dave:我在你发表评论之前就开始更新了,但是延迟了一个小时,所以他们越过了...
    【解决方案2】:

    当且仅当异常表明异常行为并且可以在本地修复(或注释)时,在本地捕获异常。

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

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

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

    【讨论】:

    • 那么没有理由在控制器中有任何 try/catch 块,嗯?
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多