Pregunta

¿Cuál es el mejor lugar para manejar las excepciones? BLL, DAL o PL?

¿Debo permitir que los métodos de la DAL y BLL para lanzar las excepciones arriba en la cadena y dejar que el PL a manejar? o debería manejarlos en el BLL?

por ejemplo

Si tengo un método en mi DAL que las cuestiones "ExecuteNonQuery" y actualiza algunos registros, y debido a una o más razones, 0 filas están afectados. Ahora, ¿cómo debo dejar que mi PL sabe que si una excepción ocurrió o no había realmente no hay filas coincidentes con la enfermedad. ¿Debo usar "intento de captura" en mi código PL y hacerle saber a través de una excepción, o debería manejar la excepción al DAL y devolver un código especial como (-1) para que el diferenciar entre el PL (excepción) y (sin filas emparejados condición es decir, cero filas afectadas)?

¿Fue útil?

Solución

No tiene sentido dejar que una excepción que se produce en la burbuja DAL hasta el PL - ¿Cómo es el usuario supone que reaccionar si no se pudo establecer la conexión de base de datos

Las vueltas de la manija excepciones temprano, si usted puede manejarlos. No se limite a tragarlos sin salida de una pista o un mensaje de registro -. Esto dará lugar a graves dificultades y errores que son difíciles de rastrear

Otros consejos

Este es un gran tema con una gran cantidad de controversia que no sean necesarios (personas con grandes voces dando mala información!) Si usted está dispuesto a tratar con eso, seguir el consejo de s1mm0t, es sobre todo agradable.

Sin embargo, si desea una respuesta de una palabra, ponerlos en la PL. graves. Si usted puede conseguir lejos con él puso su tratamiento de errores en un gestor de excepciones mundial (todos los errores se deben registrar y dar un código para buscar el registro en la producción por razones de seguridad (especialmente si la web), pero dar los detalles completos de espalda durante el desarrollo de razones de velocidad).

Editar: (clarificación) lo que tiene que hacer frente a algunos errores en todas partes - pero esto no es una norma 'todas las funciones'. La mayoría de las veces vamos a ellos suben a la PL y el mango de error global de .NET con su propio código: ingrese la pila de llamadas completa desde allí a través de una rutina común que es accesible desde los 3 capas a través de controladores de eventos (ver EDITAR en la parte inferior del mensaje ). Esto significa que no han try / catch salpicado a través de todo el código; secciones sólo se puede esperar y error y puede manejar bien allí, o, secciones que no son críticas, con el que registrar el error e informar al usuario de la funcionalidad disponible (esto es aún más raro y para los programas de super-fiable / crítica)

Aparte de eso, cuando se trabaja con artículos de recursos limitados, a menudo uso la palabra clave 'usando' o try / finally / intento final sin la captura. para multithreading banderas / mutex / prevención de re-entrada de bloqueo / etc. También es necesario intentar /, finalmente, en los casos todo lo que su programa sigue funcionando (especialmente aplicaciones con estado).

Si utiliza incorrectamente excepciones (por ejemplo, para hacer frente a los no-bugs cuando se debe utilizar la sentencia if o comprobar que una operación dudoso funcionará antes de intentarlo), esta filosofía se desintegrará más.

Una nota al margen, en aplicaciones de cliente pesado sobre todo cuando existe la posibilidad de perder cantidades significativas o de entrada de los usuarios, que puede ser mejor, con más try / capturas cuando intenta guardar los datos (marcados como no-todavía- válida, por supuesto).

editar otra necesidad de tener al menos el registro de rutina en el PL - esto va a funcionar de manera diferente dependiendo de la plataforma. Una aplicación que estamos trabajando en las acciones de la BLL / DAL con 3 versiones: Una versión PL ASP.Net, una versión de Windows Forms, y un modo de consola de aplicación lotes de regresión Pruebas de versión. La rutina de registro que se llama en realidad es en el BLL (DAL la única lanza errores o totalmente se ocupa de cualquier de ellos se pone o re-lanza). Sin embargo, esto provoca un evento que se maneja por el PL; en la web que pone en el registro del servidor y hace visualización de mensajes de error al estilo Web (mensaje amistoso para la producción); WinForms en una ventana de mensaje especial aparece con información de soporte técnico, etc., y registra el error detrás de las escenas (los desarrolladores pueden hacer algo 'secreto' para ver la información completa). Y, por supuesto, en la versión de prueba es un proceso mucho más simple pero diferente también.
No estoy seguro como lo habría hecho de que en el BLL excepto para pasar un parámetro 'qué plataforma,' pero ya que no incluye winforms o bibliotecas asp que el registro depende, que todavía sería un truco.

La respuesta corta es que depende!

Usted únicamente debe manejar una excepción si se puede hacer algo útil con él. El 'algo útil' depende otra vez de lo que está haciendo. Es posible que desee registrar los detalles de la excepción, aunque esto no es realmente su manipulación y en que realmente debe volver a emitir la excepción después de entrar en la mayoría de las circunstancias. Es posible que desee para envolver la excepción de alguna otra excepción (posiblemente a medida) con el fin de agregar más información a la excepción. Como toques en @mbeckish, es posible que desee para tratar de recuperarse de la excepción de volver a intentar la operación, por ejemplo - se debe tener cuidado de no volver a intentar siempre sin embargo. Por último (el interior) es posible que desee utilizar un bloque finally para limpiar cualquier recurso como una conexión de base de datos abierta. Lo que decida hacer con la excepción influirá en el que maneje la misma. Lo más probable es que no hay una gran cantidad de cosas útiles que se pueden hacer con muchas excepciones que las que informe al usuario de que se ha producido un error en cuyo caso sería más que aceptable para manejar la excepción en la capa de interfaz de usuario e informe del problema para el usuario (que probablemente debería registrar la excepción, así, más abajo en sus capas).

Al lanzar excepciones a sí mismo, se debe sólo alguna vez lanzar excepciones en 'exceptional'circumstances ya que hay una gran sobrecarga en el lanzamiento de excepciones. En su ejemplo sugiere que puede estar pensando en lanzar una excepción si no hay registros se actualizan por su operación. ¿Es esto realmente excepcional? Una mejor cosa que hacer en esta situación sería la de devolver el número de registros actualizados - esto todavía puede ser una condición de error que debe ser reportados para el usuario, pero no es excepcional como el mandato que ha fallado porque el connecction con el PP tiene abajo ido.

Este es un artículo de razonable sobre la gestión de excepciones mejor prácticas.

La capa que sabe qué hacer con las cosas conjunto adecuado debe ser la capa que controla la excepción. Por ejemplo, si decide controlar los errores de punto muerto por volver a intentar la consulta de un cierto número de veces, entonces se podría construir eso en su DAL. Si sigue fallando, entonces es posible que desee dejar que la burbuja excepción hasta la siguiente capa, que puede entonces decidir si se sabe cómo manejar adecuadamente esta excepción.

Todas las capas en su aplicación deben manejar excepciones gracefullly. Esto se conoce como un corncern transversal, porque aparece en todas sus capas. Me creer que el uso de un marco de excepción como Enterprise Bloquear con unidad, el resultado final será con un código mejor en general. Echar un vistazo a este post

http://msdn.microsoft. com / es-es / library / ff664698 (v = PandP.50) .aspx

Se necesitará algún tiempo para dominar, pero hay un montón de ejemplos y screencast por allí.

Como manejar excepciones depende de las necesidades técnicas y de negocio. Para las actualizaciones de bases de datos complejas o muy importantes incluyo a cabo params que pasan a una pequeña lista de errores conocidos de copia de seguridad a la lista de lesionados. De esta manera, los escenarios de error conocidos puede ser resuelto mediante programación en algunos casos. En otros casos es necesario el error que estar conectado y el usuario debe ser notificado de un error.

Me hacen una práctica de la notificación a un ser humano de errores. Por supuesto, el registro nos dará información detallada, pero no es sustituto para el tiempo de respuesta de un ser humano. No sólo eso, sino por qué los desarrolladores de fuerza para ver los registros del sistema para ver si las cosas van al sur? Hablar de costo innecesario.

Si usted tiene tiempo para definir posibles errores / excepciones y programación resolverlos, entonces por todos los medios lo hacen. Muchas veces los errores / excepciones son inesperados. Es por eso que es importante estar preparados para ese inesperado y qué mejor manera de hacerlo que implica un ser humano.

En general, uno debe estar a la defensiva en la planificación de la gestión de excepciones. Programas crecen o mueren. Una parte del crecimiento es la introducción de errores. Así que no haga girar sus ruedas tratando de matarlos a todos.

La pregunta es, donde es relevante la excepción? Si se trata de una excepción de acceso a datos que debe ser capturado en el DAL. Si se trata de una excepción de la lógica que debe ser capturado en el BLL. Si se trata de una excepción de la presentación a continuación, en el PL.

Por ejemplo, si su DAL lanza una excepción que debe devolver un valor nulo o un falso o lo que sea el caso a su BLL. Su BLL debe saber qué hacer si el DAL devuelve un valor nulo, tal vez lo pasa a través de, tal vez intenta llamar a otra función, etc. Lo mismo ocurre con su PL si el BLL pasa a través de un nulo de la DAL o vuelve algo específico de su propia continuación, la capa de presentación debe ser capaz de notificar al usuario final que no era un problema.

Por supuesto que no se consigue la verbosa mensajes de excepción, pero eso es una cosa buena por lo que sus usuarios están preocupados. Usted debe tener un sistema de registro flexible para atrapar estas excepciones y les informe a una base de datos o un ip: puerto o lo que decida.

En esencia, es necesario pensar en términos de separación de las preocupaciones si la preocupación es un dato tema o una cuestión lógica que debe ser manejado en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top