2010-04-13 10 views
7

Estoy escribiendo algunos datos de código de acceso y quiero verificar los estados de datos potencialmente "inválidos" en la base de datos. Por ejemplo, estoy devolviendo un widget de la base de datos y solo espero uno. Si obtengo dos, quiero lanzar una excepción. Aunque la integridad referencial debería evitar que esto ocurra, no quiero depender de que los DBAs nunca cambien el esquema (para aclarar esto, si se elimina la restricción de la clave primaria y me atrapan, quiero romper de forma rápida y clara).¿Qué excepción .NET arrojar para el estado de base de datos no válida?

Me gustaría utilizar System.IO.InvalidDataException, excepto que no estoy tratando con una secuencia de archivos por lo que sería engañoso. Terminé yendo con una excepción de aplicación genérica. Alguien tiene una mejor idea?

Respuesta

15

InvalidDataException parece bastante razonable yo:

  • El nombre se ajusta perfectamente
  • La descripción se ajusta bastante razonable si tenemos en cuenta que es efectivamente un dato "corriente" de la base de datos
  • Nada en la descripción menciones archivos, por lo que no estaría preocupado por ese lado de las cosas

Está efectivamente deserializando los datos de una tienda. Resulta ser un RDBMS, pero eso es relativamente poco importante. Los datos no son válidos, por lo que InvalidDataException encaja bien.

Para decirlo de otra manera: si fuera cargando los datos de un archivo, ¿usaría InvalidDataException? Suponiendo que lo haga, ¿por qué debería importar de dónde provienen los datos, en términos de la excepción que se arroja?

+0

Sí, lo usaría para cargar datos de un archivo. Estoy de acuerdo con su lógica. Voy a seguir adelante y usar InvalidDataException. – jslatts

+2

Esta es probablemente la clase de excepción existente más adecuada. En mi humilde opinión, en mi humilde opinión, a pesar del argumento del flujo de datos de @Jon Skeet, lanzo una excepción desde el espacio de nombres 'System.IO' cuando haces cosas relacionadas con 'System.Data'. (Por supuesto, el significado concreto de los espacios de nombres no debe sobreestimarse, pero todavía transmite un mensaje sutil de que podría no ser * bastante * lo correcto arrojar). Creo que en este caso, proporcionar una clase de excepción personalizada sería estar justificado – stakx

+0

Personalmente Im en contra de arrojar excepciones de marco nativo de código no de marco porque las solicitudes de soporte pueden no dirigirse correctamente. Quizás una subclase llamada ApplicationInvalidDataException sería apropiada? –

0

Se podría escribir una excepción personalizada si no encuentra ninguna norma-excepción adecuada ...

Pero, usted dice:

A pesar de que la integridad referencial debe evitar que esto ocurra, me no desea depender de los DBA sin cambiar el esquema.

Cuando alguien cambia el esquema de base de datos, los cambios son bastante grandes que usted tendrá que hacer algunas modificaciones a su código/acceso de datos de aplicación, así ...

+2

Err, dije eso mal. Solo quiero que el error salga rápidamente a la superficie es que el esquema se ha cambiado por debajo de mí. Sé que podría crear una excepción personalizada, pero quería asegurarme de no perderme un buen valor predeterminado. – jslatts

6

Si necesita una excepción que haría describa exactamente la situación con la que está tratando, ¿por qué no hacer su propia excepción?

Simplemente hágalo de System.Exception.

+0

Solo estaba tratando de seguir los consejos de Brad Abram y quería asegurarme de no perderme una excepción integrada adecuada: http://blogs.msdn.com/brada/archive/2005/03/27/402801.aspx – jslatts

+0

+1 Crear mi propia excepción sería también mi consejo: es su amigo cuando busca errores. Aún más cuando se trata de límites y restricciones vinculados a su aplicación o lógica comercial. – Filburt

1

que podría estar tentado a utilizar uno de los siguientes:

InvalidConstraintException
NotSupportedException
OverflowException

O, simplemente, seguir adelante y crear mi propia: TooManyRowsException

+1

Eso lo hace parecer que la restricción en sí no es válida - ViolatedConstraintException o ConstraintViolationException? –

+0

@Jon: En cierto modo, es una restricción que se ha violado. En su caso, la restricción existe, simplemente tiene miedo de que el tipo de la base de datos lo abandone. – NotMe

Cuestiones relacionadas