共享错误处理代码的设计模式

时间:2010-07-07 11:32:41

标签: c# exception design-patterns error-handling

我正在寻找关于在API中调用方法的代码层的架构的一些想法/意见。在我的例子中,调用代码是C#/ .NET,API是非托管旧DLL的一部分。但同样的问题可能适用于许多不同的语言/环境。

我基本上是围绕非托管API编写托管包装器。包装器用于处理对非托管代码的封送处理,并将较低级别的错误和异常转换为托管异常。

经常出现以下模式,即API中的每个函数:

public void CallMethodX(<params>)
{
    try
    {
        API.MethodX(<params);
        <common code for checking for error conditions in API; convert to exceptions and throw>
        <common code for logging API call>
    {
    catch (SEHException xx)
    {
        <common code for querying API for more info on error and creating new managed exception>
    }
}

另请注意:各种API方法可以有不同的签名。

基本问题是:人们建议抽象出用于记录和错误处理的公共代码。即使在最好的情况下,即通过将公共代码移动到静态实用程序函数中,每个API方法调用都会有很多重复的样板代码。

我的一些想法包括:

  • 将公共代码移动到实用程序类中,该实用程序类接受实际方法的委托并将委托注入实用程序类。然后,实用程序类执行实际的异常处理和日志记录。 [工作正常,但创建/传递委托有点笨拙/丑陋]。

  • 使用命令模式。 [会很好地工作,但是为了共享代码似乎增加了很多复杂性]

还有其他想法吗?在哪里放置常见的异常处理代码的最佳OO实践?请注意,我不希望将处理程序代码放在调用堆栈的上方,即使用调用我的层的客户端找到它 - 因为该层应该与查询API的详细信息完全分离,以获取详细的错误信息并转换为托管异常

1 个答案:

答案 0 :(得分:4)

您可以看到的一个解决方案是Aspect Oriented Programing。这是AOP设计的问题类型。不幸的是,很多语言都不能很好地支持AOP,但如果你谷歌进行C#面向方面编程,你会发现它是可行的Aspect Oriented Programming Using .Net