2010-12-17 15 views
8

Si tengo una aplicación en capas y mi capa de datos puede encontrar una OptimisticConcurrencyException ¿cómo debe lidiar la capa de llamada o la capa inferior con esto?Manejo de excepciones en una aplicación en capas

La capa llamada no tiene idea de lo que un OptimisticConcurrencyException es, por lo que debería ser una excepción personalizada poniendo en práctica y controlar el OptimisticConcurrencyException y lanzando mi excepción personalizada?

Alguna orientación sobre esto sería muy apreciada.

Respuesta

7

OptimisticConcurrencyException es una excepción que pertenece a la capa de datos y, por lo tanto, debe estar contenida en ella. Es poco probable que la capa de llamada pueda manejarlo.

Crearía una excepción más genérica como DataSourceException que contendría algún contexto como qué función falló (y con qué parámetros) y por qué. También incluiría la excepción original como excepción interna.

leer mi entrada de blog sobre la captura de excepciones: http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

También he escrito algunas otras entradas sobre el manejo de excepciones, haga clic en la etiqueta de excepción.

actualización

me gustaría crear los siguientes proyectos:

  • Project.Web < --- Permite utilizar el servicio a través de las interfaces de especificación.
  • Project.Service < - implementa todo en la Especificación
  • Project.Service.Specification < --- Colocar excepciones (clases) aquí y las interfaces que definen sus servicios (o repositorios si no se utiliza ningún servicio)
+0

Mi UI es MVVM, quiero que mi ViewModel avise al usuario de que el registro fue actualizado por otro usuario y realice una navegación en consecuencia, pero ¿qué tipo de excepción capto? En esa capa, solo podría identificar la excepción como una System.Exception. – David

+0

En este caso, cree una excepción que indique que el registro ha cambiado. Por ejemplo 'EntityChangedByOtherException' o algo así. Siga el patrón de Interfaz separada que se encuentra aquí: http://martinfowler.com/eaaCatalog/separatedInterface.html para reducir el acoplamiento entre las capas. – jgauffin

+0

@jgauffin, gracias de nuevo por la respuesta. ¿Sugiere que implemente, por ejemplo, EntityChangedByOtherException (que heredaría de System.Exception) en el ensamblado/capa que lo arrojaría y definiría una interfaz para él en otro ensamblaje, p. IEntityChangedByOtherException que mi VM usaría? – David

4

Debe ver esto desde la perspectiva de la capa de llamada. La capa solicitó a la capa de datos que realice un trabajo. Si el OptimisticConcurrencyException puede ser manejado por su capa de datos y el contrato se ha cumplido, entonces apúntelo y luego continúe y complete el trabajo.

Si, sin embargo, esto es fatal para el trabajo que se le pide que haga, y si la persona que llama no lo está esperando, o no lo sabe, entonces está bien que cree su propia clase de excepción, capte la excepción que es ajena a la capa de llamada, y arroje eso en su lugar. Esto es algo que la capa de llamada puede saber, y puede estar bien documentada como un efecto secundario del uso de esta función/API.