【问题标题】:is this correct way to use try catch block这是使用try catch块的正确方法吗
【发布时间】:2015-07-28 15:39:05
【问题描述】:

如果方法 resubmit() 出现问题,我想抛出异常

 var manager = new ApprovalsDashboardManager();        
    try
    {
        manager.Resubmit(requestId, userId);
    }
    catch (Exception e)
    {

        throw new ApplicationException("Resubmit Request Failed, Please resubmit in a while", e.InnerException);
    }

是他使用 try catch 块的正确方法吗?我想知道如何错误处理在我当前项目中调用的其他项目中的方法。

【问题讨论】:

  • 如果你抛出一个ApplicationException,你应该只捕获ApplicationExceptions。这将阻止您忽略可能发生的其他错误。捕获所有异常通常是一种不好的做法。异常处理也是让你可以处理问题。抛出另一个异常基本上是没有意义的。您应该通过显示消息框或其他方式来管理错误。
  • 如果您要做的只是抛出另一个异常,为什么还要捕获异常?首先在此时捕获异常实际上有什么价值吗?
  • 如果你用另一个异常包装一个异常(我不判断它在给定上下文中本身是好还是坏),异常构造函数的第二个参数应该是e e.InnerException 的可能。

标签: c# try-catch except


【解决方案1】:

从语法上讲,是的,这是使用 try-catch 块的正确方法。但是,如果您有权访问代码,我建议您修改 ApprovalsDashboardManager.Resubmit() 方法,以便在出现问题时抛出您的自定义 ApplicationException。捕获一个异常只是为了抛出另一个异常有点多余。

编辑:但是,这样做并不是“坏习惯”。此用例包含在 try-catch 的 MSDN 页面中。 https://msdn.microsoft.com/en-us/library/0yd65esw.aspx

【讨论】:

    【解决方案2】:

    如果您的“重新提交”函数抛出异常,则无需再次抛出异常。只需向用户提供一些有关发生的事情的信息,就可以处理异常。

    所以你会在捕获的某个地方执行此操作。您在异常的 Message 中添加了更多信息,这是正确的做法。

    【讨论】:

      【解决方案3】:

      正如您所做的那样,包装异常的问题在于它倾向于隐藏错误的真正来源,因为堆栈跟踪反映了引发异常的点。这在一定程度上有所缓解,因为您已将原始异常包含为 InnerException

      如果您隐藏了实现细节并且不想通过异常将这些细节暴露给用户,那么这样做是合法的。但大多数情况下,异常的用户是开发人员,您可以为他们提供的信息越准确、越详细越好。

      我也对捕获所有异常保持警惕。例如,如果您收到 OutOfMemoryException 会发生什么?你真的想忽略它吗?如果您不知道如何处理内存不足,那么最好让该异常冒泡到下一个级别,其他代码可能知道如何处理它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        相关资源
        最近更新 更多