我正在开发一些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);
}
}
}
答案 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>();