2009-09-21 8 views
36

Me preguntaba qué tipo de excepción debería arrojarse para los datos faltantes. Por ejemplo, si un nodo xml no contiene datos. Sería fácil "lanzar nueva excepción (...)" pero esto no es recomendable. Otra opción sería crear una nueva clase de excepción como MissingDataException o InvalidDataException, pero ¿no hay una clase de excepción incorporada para este caso?Excepción de datos faltantes

+2

¿Por qué lanzar una excepción cuando puede devolver el resultado de la función que indica que faltan algunos datos? – Lightman

Respuesta

48

Como regla general, compruebe las excepciones de .NET framework existentes para una excepción adecuada para lanzar antes de derivar la suya. Para responder a su pregunta directamente, no hay ninguna excepción de "datos faltantes" actualmente disponible para lanzar, pero eso no significa que no haya excepciones adecuadas para cubrir su situación.

En su caso, el humilde InvalidOperationException puede ser adecuado; esta excepción se produce cuando se llama a un método en un objeto, pero el estado del objeto no es apropiado para la operación. Ejemplos de esto incluyen métodos de llamada en una secuencia cerrada y un enumerador que ha pasado el final de la colección. Si los datos XML son el estado interno de un objeto y una llamada a un método ha descubierto los datos incorrectos, InvalidOperationException es un buen candidato.

Si está pasando sus datos XML a un método, un ArgumentException, o uno de sus derivados puede ser una opción adecuada. Hay una pequeña familia de estas excepciones, todas indicando que un argumento pasado a un método no es el esperado.

Solo querrá crear una excepción personalizada cuando desee que las circunstancias excepcionales se manejen de forma diferente a otras excepciones. Si elige crear su propia excepción, asegúrese de derivarla de una excepción superior a Exception, de modo que la naturaleza de la excepción esté implícita en la clase base.

+0

+1 Acepto 100 por ciento, use lo que el sistema ofrece y solo entonces si no puede encontrar algo que funcione, cree excepciones personalizadas. –

+0

Un posible candidato también sería 'ValidationException' –

2

Puede usar System.Xml.XmlException.

Editar: Incluso si System.Xml.XmlException podrían caber, creo que debe definir su propia excepción, ya que sería más preciso, y se podría describir qué tipo de datos que falta: un id, una fecha, etc.

+3

System.Xml.XmlException es utilizado por el tiempo de ejecución para indicar un error al leer un documento XML, específicamente cuando el XML no tiene el formato correcto (por ejemplo, etiqueta no cerrada, elemento raíz faltante). Incluso incluye números de línea y personaje. No me parece especialmente adecuado. –

+0

Si su XML debe tener datos en un nodo, y no tiene ninguno, IMO el XML no tiene el formato correcto, por lo que puede mostrar en qué línea (incluso qué número de char si lo desea). Creo que esto encaja, incluso si definir su propia excepción sería mejor. –

7

No llame a "lanzar nueva excepción", porque no sabe cómo manejar la excepción.

Defina su propia excepción. Sea más específico, como XMLDataMissingException. Luego puede dar un mensaje memorable al usuario o iniciar sesión.

+0

Establezca el mensaje con los detalles. –

-5

throw new Exception ("mi mensaje"); (u otra Excepción incorporada) suele ser el enfoque correcto. La alternativa es una explosión de clases de excepción que solo pueden usarse una vez.

Si se justifican nuevas excepciones, se deben crear en el contexto del dominio, no en el problema.

1

Como regla general, debe lanzar excepciones en circunstancias excepcionales. Si los datos en cuestión afectan negativamente el estado o el comportamiento del objeto, genere una excepción personalizada. Un enfoque alternativo podría incluir algún tipo de validador que active eventos que su cliente maneje con elegancia, por ejemplo, informe el error al usuario final o inserte valores predeterminados.

Tuve un problema similar al descrito en el que tenía 2 clientes (llámalos A & B) leyendo y modificando un único archivo xml. Cliente Un nodo eliminado X luego el Cliente B intentó actualizar el nodo X. Claramente, la actualización de un nodo que ya no existe es un problema. Para resolver este problema, me inspiré en SQL Server, que informa el número de filas afectadas por una instrucción UPDATE.En este caso particular, planteé el evento UpdateNode de forma normal con varias propiedades afectadas de filas configuradas en cero.

+0

Probablemente deba definir lo que quiere decir con * excepción personalizada * –

12

También existe la clase System.Data.ObjectNotFoundException que puede considerar.

+1

Esa forma parte de System.Data.Entity.dll y podría crear una dependencia innecesaria. – Stijn

+4

@Stijn Sure.That es por eso que dije 'usted puede considerar'. –

Cuestiones relacionadas