Architecture 异常处理设计

Architecture 异常处理设计,architecture,exception-handling,mapping,automapper,Architecture,Exception Handling,Mapping,Automapper,在我当前的项目中,有一些组件/lib被设计为适配器。 例如,一个适配器封装了对文件系统的IO访问 在实际的异常处理设计中,适配器必须抛出特定的异常,如FileSystemFileNotFoundException 特定于适配器的异常必须从适配器基异常派生 主要原因是开发人员有一种相对较好的方法来捕获所有特定于适配器的异常 有时,基本异常会提供额外的信息,对于IO适配器,源文件和目标文件属性包含每个文件的完整路径和文件名 主应用程序有三个不同场景的基本例外 有几个适配器是从主应用程序调用的。 现在

在我当前的项目中,有一些组件/lib被设计为适配器。
例如,一个适配器封装了对文件系统的IO访问

在实际的异常处理设计中,适配器必须抛出特定的异常,如
FileSystemFileNotFoundException

特定于适配器的异常必须从适配器基异常派生

主要原因是开发人员有一种相对较好的方法来捕获所有特定于适配器的异常

有时,基本异常会提供额外的信息,对于IO适配器,源文件和目标文件属性包含每个文件的完整路径和文件名

主应用程序有三个不同场景的基本例外

有几个适配器是从主应用程序调用的。
现在,每个适配器在主应用程序中都需要自己的异常映射逻辑。
从适配器映射到应用程序异常类型,在附加异常信息上做一些工作,等等

当前需要以下代码来映射源与目标异常

        var map = new Dictionary<Type, Type>()
        { typeof(FileAlreadyExistsTechnicalException) } };

        var fileSystemAdapterException = ex as FileSystemAdapterBaseException;
        if (fileSystemAdapterException != null)
        {
            var exception = from mapping in map
                            where mapping.Key.Equals(fileSystemAdapterException.GetType())
                            select mapping.Value;

            var baseTechnicalException = (TechnicalException)Activator.CreateInstance(exception.Single());

            baseTechnicalException.AddPlaceholderEntry(ExceptionPlaceholderConstants.File, fileSystemAdapterException.SourceFile);

            resultException = baseTechnicalException;
        }

        return resultException;
var-map=newdictionary()
{typeof(filealreadyexisttechnicalexception)};
var fileSystemAdapterException=ex作为FileSystemAdapterBaseException;
如果(fileSystemAdapterException!=null)
{
var exception=来自映射中的映射
其中mapping.Key.Equals(fileSystemAdapterException.GetType())
选择mapping.Value;
var baseTechnicalException=(TechnicalException)Activator.CreateInstance(exception.Single());
baseTechnicalException.AddPlaceholderEntry(ExceptionPlaceholderConstants.File、fileSystemAdapterException.SourceFile);
结果异常=基本异常;
}
返回结果异常;
1.)这个设计好吗?
2.)该映射如何通用化?

我首先想到了,但他能不能给我机会在附加信息上做一些额外的工作?

我建议您可以使用通用异常。您可以定义一个异常类OperationFailedNopException(意味着操作以不执行任何操作的方式失败),然后从中派生一个泛型类OperationFailedNopException,其中泛型类型参数是原始抛出异常的类型。想要捕获包装在特定外部异常中的特定类型的内部异常的代码可以这样做。最重要的一点是,我不知道有什么方法可以让这样的事情继续发生(因此,如果BarException派生自FooException,抛出的BarException可以以这样一种方式包装,即期望操作失败的东西NoException可以捕获它)。

您的第一个问题是:“这是一个好的设计吗?”。如果不深入了解更多细节和大局,很难回答这个问题。但考虑到你提供的一切,我不得不回答:“不”。这不是一个好的设计,因为它太复杂了。在我看来,您的异常处理比为其构建的实际系统更复杂。记住,我只是在猜测。如果我是一个必须支持您的代码库的开发人员,我只有一个问题:“为什么?”。为什么必须尽可能简单的异常处理被包装成自己的范例

您有适配器和相应的异常类,并且希望保留原始异常。异常的美妙之处在于它们是链接的(至少在Java/.NET世界中是如此)。在Java中,.NET-Exception.InnerException中有Exception.getCause()。在我看来,处理和传播不同抽象层之间的异常是您所需要的,也是所有其他人所期望的