【问题标题】:How to manage specific and generic exceptions如何管理特定和通用异常
【发布时间】:2017-09-06 09:12:17
【问题描述】:

如果这里的 OracleException 不是我想要的,这里会发生什么?我需要扔吗?在这里也捕获一个通用异常是正确的做法吗?

try
{
    does some code
}
catch (OracleException ex)
{
    if (ex.Number == 20001)
    {
        throw new ValidationException("Unable blah blah blah");
    }
    throw;
}
catch (Exception ex)
{
    // Log it
    TraceHelper.WriteLine("Exception updating tblah + Environment.NewLine + ex.StackTrace, MessageCategory.Error);
    throw;
}

【问题讨论】:

    标签: c# .net exception exception-handling


    【解决方案1】:

    当您的代码中出现错误时,您应该意识到这一点。你是怎样做的?通常会崩溃或放置一个捕获异常并以某种方式通知开发人员的全局异常处理程序。

    捕获通用异常而不抛出它与前面的语句相违背,因此建议不要这样做。

    快速失败通常被认为是一种好习惯 (here a description)

    最后但不是租赁,您通常不想捕获您不知道如何从中恢复的异常。如果你有一个错误并且你有一个 ArgumentNullException,你会在你的应用程序中做什么?您无法在代码中从这种情况中恢复,您必须失败,通知用户和开发人员并结束应用程序。

    【讨论】:

      【解决方案2】:

      这看起来您只想根据该异常的某些条件捕获OracleException。好消息是,使用 C# 6.0 您可以添加 when 子句来添加该条件:

      catch (OracleException ex) when (ex.Number == 20001) 
      { 
          throw new ValidationException("Unable blah blah blah");
      }
      

      这意味着如果ex.Number 不是20001,则抛出的异常将检查您拥有的下一个catch 子句,在这种情况下,它将落入您的通用catch 中。

      是否应该存在通用捕获是有争议的,作为通用的经验法则,您不应该进行通用异常处理。如果你不知道代码为什么会抛出异常,你怎么能期望它成功处理呢?

      【讨论】:

      • 很好,如果它不是 20001 类型会发生什么?我想这就是我不确定如何处理的问题。
      • 看起来我正在运行 6.0 并且无法在短期内更新它
      • 在这种情况下,我所掌握的准确吗?我的 api 中有一个全局异常处理程序,它将拾取并向前端显示正确的错误处理。
      • 如果你不知道代码为什么会抛出异常,你怎么能期望它成功处理呢?为此+1!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多