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

标签 c# exception design-patterns error-handling

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

我基本上是在围绕非托管 API 编写托管包装器。包装器的存在是为了处理对非托管代码的编码(marshal)处理,并将较低级别的错误和异常转换为托管异常。

以下模式经常出现,即对于 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 方法可以有不同的签名。

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

我的一些想法包括:

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

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

还有其他想法吗?在哪里放置通用异常处理代码的最佳 OO 实践?请注意,我不想将处理程序代码放在调用堆栈的更高位置,即将它与调用我的层的客户端一起定位——因为该层应该与查询 API 以获取详细错误信息和转换为托管异常的细节完全分离.

最佳答案

您可以查看的一个解决方案是 Aspect Oriented Programing .这就是 AOP 设计的问题类型。不幸的是,很多语言都不能很好地支持 AOP,但是如果你在谷歌上搜索 C# Aspect Oriented Programing,你会发现它是可行的,参见 Aspect Oriented Programming Using .Net

关于c# - 共享错误处理代码的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3194268/

相关文章:

c# - Autofac Singleton On激活解析

java - 我如何控制另一个类中的构造函数访问

C# 在 Queryable 中使用 Linq

c# - 如何防止枚举值的按位或组合?

c# - 吞下未处理的异常(调试器除外)

WPF - DispatcherUnhandledException 似乎不起作用

c# - NHibernate:在同一对象上具有与映射属性相同的非映射属性

c# - 如何将nuget包添加到共享项目

java - Jenkins Build 因 SVNException 而失败

testing - "garbage adapter pattern"是什么?