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

标签 c# exception error-handling

我正在开发一些 C# 类或者更好的组件。它们彼此嵌套得相当深,任何一步都可能出错。

因此,我可以让类 A 调用类 B 上的方法,类 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);
          }
     }
}

最佳答案

我认为这取决于异常(exception)情况。我不喜欢第二种方法,因为正如您所说,它需要更多的代码和更多的维护,并且总是存在忘记检查“HasError”标志的风险,这会给您带来无尽的头痛。不知道为什么有些东西不起作用。

所以我通常会抛出异常 - 你需要考虑到底是什么会导致出现问题。

是否是用户输入了无效数据?如果是这样,那么您可能应该在调用该方法之前进行一些验证。

它是否是可能引发错误的外部资源(例如数据库或文件系统)?如果是这样,那么您可能应该允许它传播并在您的 A 类中捕获它。

基本上,如果您可以尝试消除任何可能出现错误的情况,那么如果所有其他方法都失败,则完全可以抛出异常并让它“波及”顶级类。您也可以(并且可能应该)为这些创建一些自定义异常类,这样您就可以有不同的捕获。例如:

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 实例注入(inject) A 类而不是调用 ObjectFactory.GetInstance<ILog>();

关于C# 异常处理与方法结果返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24672883/

相关文章:

java - 未处理的异常如何影响 JVM?

android - NoSuchMethodError,迭代器调用为null

java - 可以在 catch block 中访问 try block 内定义的标签吗?

c# - DTO POCO转换

c# - Winforms ListView MouseUp 事件多次触发

c# - 如何在不淡化文本的情况下禁用文本框?

android - 没有此功能时获取下一个警报信息

python 类未实例化 - 捕获/调试的方法?

javascript - 如何处理 ETIMEDOUT 错误?

c# - 我如何做到这一点,以便当用户进入文本框时,文本消失? C#