C#异常处理与方法结果的返回错误

时间:2014-07-10 09:25:26

标签: c# exception error-handling

我正在开发一些c#类或更好的组件。它们在另一个中嵌套得非常深,任何步骤都可能出错。

所以我可以让A类调用B类的方法,它可以调用类C和D上的方法。现在,除了A类负责处理发生的任何错误外,其他任何类都可能出错。在处理过程中提醒用户并为处理生成适当的响应。

现在的问题是我不知道使用哪种方法。我可以使用异常并在顶级类A中捕获它们,或者返回在嵌套类上调用的每个方法的单个结果,如果进程成功与否则包含信息。这将是最方便的,因为我需要的是在顶级类上捕获异常。另一方面,这可能会很慢。这可能发生在每分钟100次甚至每秒10次。

因此,使用上面A类方法看起来像:

public class A
{
     private ILog _logger = ObjectFactory.GetInstance<ILog>();

     public void ProcessMethod()
     {
          try
          {
              var b = new B();
              b.Process();
          }
          catch(ProcessException ex)
          {
              _logger.Debug(ex.Error);
          }
     }
}

或者,如果执行成功,我可以使用从方法返回。我试图避免这种情况,因为它更难以维护:

public class A
{
     private ILog _logger = ObjectFactory.GetInstance<ILog>();

     public void ProcessMethod()
     {

          var b = new B();
          var result = b.Process();
          if (result.HasError)
          {
               _logger.Debug(result.Error);
          }
     }
}

1 个答案:

答案 0 :(得分:2)

我认为这取决于例外情况。我不喜欢第二种方法,因为正如你所说的那样,维护更多代码和更多代码,并且始终存在忘记检查&#34; HasError&#34;当你不知道为什么某些东西不起作用时,这会让你感到头疼。

所以我通常会抛出异常 - 你需要考虑究竟是什么会导致出错。

是否是用户输入无效数据?如果是这样,那么在调用方法之前你应该做一些验证。

它是一个外部资源,如数据库或文件系统,可能会抛出错误?如果是这样,那么你应该允许它传播并在你的A类中捕捉它。

基本上,如果你可以尝试消除任何你会遇到错误的情况,那么如果所有其他方法都失败了,那么抛出一个异常并让它“r r r&&&perfectly&#34;到顶级课程。您可以(也可能应该)为这些创建一些自定义异常类,以便您可以拥有不同的捕获。例如:

public void ProcessMethod()
     {
          try
          {
              var b = new B();
              b.Process();
          }
          catch(DatabaseException ex)
          {
              _logger.Debug(ex.Error);
          }
          catch(InvalidInputException ex)
          {
              _logger.Debug(ex.Error);
          }
          catch(ProcessException ex)
          {
              _logger.Debug(ex.Error);
          }
     }

另外 - 在一个完全单独的注释中,您是否考虑将_logger实例注入A类而不是调用ObjectFactory.GetInstance<ILog>();