2011-02-23 55 views
0

在我当前的项目中有一些组件/库被设计为适配器。
例如,一个适配器将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; 

1.源)这是一个好的设计?
2.)这个映射如何推广?
我首先想到了AutoMapper,但是他能否给我提供额外信息做额外工作的可能性?

回答

1

你的第一个问题是:“这是一个很好的设计?”。没有深入细节和理解大局,很难回答它。但鉴于你提供的一切,我必须回答:“不”。这不是一个好的设计,因为它非常复杂。在我看来,你的异常处理比它所构建的实际系统涉及更多。请记住,我只是猜测。如果我是需要支持代码库的开发人员,我只会遇到一个问题:“为什么?”。为什么异常处理必须尽可能简单,被包含进它自己的范例中?

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

0

我建议你可以使用泛型异常。你可以定义一个异常类OperationFailedNopException(意思是一个操作失败,以至于什么也不做),然后从中派生出一个泛型类OperationFailedNopException <T>,其中泛型类型参数是原始抛出异常的类型。想要捕获包含在特定外部异常中的特定类型的内部异常的代码可以这样做。最重要的警告是,我不知道有什么办法可以使这种事情变成联想(这样,如果BarException从FooException派生,那么抛出的BarException可能会被这样一种方式包装,以致期望OperationFailedNopException FooException >的东西可以捕获它)。