Pregunta

A veces no saben tipo de bruja excepción debería lanzar. Por lo que suelen tirar Excepción (). ¿Hay algún buen artículo sobre esto?

¿Fue útil?

Solución

Si usted no está haciendo ningún intento de recuperarse de un error, puede simplemente tirar un Exception con una cadena que le diga lo que salió mal. (O si va a realizar la misma acción, independientemente de lo que ha producido un error).

Aparte de lo que es obvio para un programador lo que salió mal mediante el uso de un nuevo nombre de la excepción en lugar de ponerlo en el mensaje, y la excepción puede contener datos para ayudarle a recuperarse de una excepción en particular.

Por ejemplo, un ArgumentNullException tiene una ParamName propiedad, que debe establecer cuando se lanza la excepción. Cuando la captura de llamadas, él puede entonces buscar esta propiedad y decidir que pasar un nuevo valor para el argumento que causó el error, o se puede imprimir un error correspondiente para informar al programador de lo que salió mal.

Es desafortunado que las excepciones son raramente utilizados en todo su potencial (en muchos API de código abierto y tal), y con frecuencia se inserta simplemente para informar a un programador lo que salió mal. No hay mucha diferencia entre estos 2 si no va a leer la propiedad ParamName cuando lo detecta. (Mucha gente no se molestará, y sólo coger un Exception de todos modos).

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

Puede ser difícil recuperarse de un error totalmente, pero en algunas aplicaciones, sin embargo, puede que le resulte conveniente para crear excepciones personalizadas que pueden proporcionar todos los detalles que necesita.

Por ahora, me acaba de poner Exception a la búsqueda del navegador de objetos en VS, y ver lo que está allí ya. Sus nombres son bastante explica por sí mismo, por lo que debe ser capaz de elegir algo adecuado.

Otros consejos

El problema con lanzar una excepción genérica es que restringe la capacidad de su código más arriba en la pila para manejar correctamente (es decir, la mejor práctica es atrapar la mayor excepción específica posible antes de volver a caer, y sólo a la captura de lo que pueda mango).

Jeffrey Richter tiene una excelente sección sobre el manejo de excepciones (incluyendo información sobre el espacio de nombres System.Exception) en CLR a través de C #

"Instrucciones de diseño de marco" por Cwalina y Abrahms cubre este tema muy bien (en mi humilde opinión).

Está disponible de forma gratuita en línea aquí , o el libro (no libre) aquí (Reino Unido) o aquí (EEUU) . Buscar en la sección titulada Directrices de diseño para Excepciones .

Bueno, la única cosa que no debe hacer es Exception tiro en sí.
Siempre buscar una subclase apropiada.

No sé de cualquier publicación ortografía qué excepción a tirar cuando, pero ArgumentException y InvalidOperationException debe hacerse cargo de la mayor parte de los casos.

Haga preguntas separadas sobre casos separados si vienen para arriba.

Yo sugeriría que divide excepciones en varias categorías basadas en el estado del sistema:

  1. El método falló de una manera tal que no hizo nada; el estado de los datos subyacentes no se altera, y es probablemente válida. Los escenarios típicos: tratar de recuperar de una colección de un objeto que no está allí, o añadir una tarea que ya es. Otro posible escenario: un desbordamiento de las comunicaciones en los casos en que no debería haber causado una pérdida de datos (y se podría volver a intentar la operación éxito si el problema era simplemente que el otro extremo era simplemente demasiado lento).
  2. El método fallado de una manera que puede haber alterado la estructura de datos subyacente, o la estructura de datos subyacente puede haberse dañado previamente. Otras operaciones no se debe intentar con esta estructura de datos si no se toman medidas para validarlo. Otro escenario posible: un tiempo de espera de comunicación se produce cuando un registro se ha recuperado parcialmente, y los datos recuperados parcialmente ahora está perdido. Dependiendo del protocolo, puede ser necesario realizar alguna acción de recuperación en la conexión, o para cerrarla e iniciar una nueva.
  3. Algo está muy mal con el estado del sistema, y ??es probable que no es posible la recuperación.

Por desgracia, las excepciones de .NET existentes no se ajustan a nada por el estilo patrón; habría sido agradable si había un tipo ExceptionBase de la que se derivaron cosas como ThreadAbortException, CpuHasCaughtFireException, y la excepción 'normal', y todas las excepciones 'normales' se derivaron de Excepción. Entiendo que .NET 4.0 kludges un poco en este tipo de diseño, pero no sé la mecánica exacta. En cualquier caso, sugeriría que las excepciones definidas por el usuario deben ser divididos en grupos como anteriormente, con todas las excepciones en cada grupo que comparten un ancestro común distinto de otros grupos.

No es un artículo de Krzysztof Cwalina ( "el principal arquitecto del equipo de .NET Framework de Microsoft") llamado Escoger el tipo de excepción a tirar que arroja algo de luz sobre esto. Se trata de la elección de la excepción derecho a lanzar y orientación sobre la creación de excepciones personalizadas.

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