2011-02-23 92 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 >的東西可以捕獲它)。