2012-10-10 71 views
14

Tengo el siguiente código que recupera a los registros de detalles al hacer clic en una cuadrícula de la tabla:¿Qué tipo de excepción debo usar para "No se encontró registro"? (C#)

public ActionResult City(string rk) 
{ 
    try 
    { 
     var city = _cityService.Get("0001I", rk); 
     if (city == null) 
     { 
      throw new ServiceException("", "Error when fetching city " + rk); 
     } 
    } 
} 

¿Qué tipo de excepción se debe utilizar para este "Ningún registro encontrado" problema? Veo que hay diferentes tipos de excepciones, pero no estoy seguro de cuál sería apropiado o incluso si estoy codificando esto correctamente.

+4

Crea tu propia excepción. – Jeremy

+0

También podría crear su propia excepción y arrojar eso. Como RecordNotFoundException. –

+0

Supongo que este es un método de 'Controlador'. Si desea informar al usuario que no se encontró el registro, podría crear una 'Vista' especial y devolverla en lugar de arrojar una excepción. – Patko

Respuesta

22

KeyNotFoundException sería una opción razonable, y estaría en conformidad con the Microsoft guideline a:

considera lanzar excepciones existentes que residen en los espacios de nombres del sistema en lugar de crear tipos de excepción personalizada.

Sin embargo, usted podría considerar la posibilidad de crear su propio tipo Exception si (de nuevo de las directrices de Microsoft):

... usted tiene una condición de error que puede ser manejado mediante programación en una manera diferente que cualquier otro excepciones existentes.

Si crea su propia Exception, se debe seguir la guidelines for designing custom exceptions, por ejemplo, debe hacer que su tipo Exception sea serializable.

+0

Joe, tus enlaces están muertos. [Aquí está el artículo] (https://msdn.microsoft.com/en-us/library/ms229064 (v = vs.100) .aspx) Creo que originalmente vinculado a. No se mantiene, entonces [aquí está el nuevo artículo] (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exceptions) que no parece mencionar la serialización. No sabía a cuál preferiría vincular. – johnnyRose

+0

Y, para lectores futuros, [aquí hay una pregunta relacionada] (https://stackoverflow.com/q/4791823/2840103). – johnnyRose

4

Debe crear su propia excepción, y tal vez llamarlo RecordNotFoundException en este caso.

+0

No pensé en eso como una opción. Cómo puedo hacer eso. ¿Tiene que heredar? –

+1

@Anne Sí. Heredar la clase de excepción. –

0

Crear su propia excepción es bastante fácil. Solo cree una clase, asígnele un nombre, extienda Exception o algún otro tipo de excepción, y proporcione los constructores que necesita (simplemente llame a los constructores base Exception).

Si quiere agregar más, puede hacerlo, pero a menudo no es necesario.

Si cree que está creando una serie de excepciones para su proyecto, puede crear un tipo de excepción base (que extienda Excepción) que extienda todas sus excepciones. Esto es algo que podría hacer al escribir una biblioteca. Permitiría que alguien capte una excepción específica o una excepción lanzada desde su biblioteca o cualquier excepción.

public class MySuperAwesomeException : Exception 
{ 
    public MySuperAwesomeException() : base() { } 
    public MySuperAwesomeException(string message) : base(message) { } 
    public MySuperAwesomeException(string message, Exception innerException) 
     : base(message, innerException) { } 
} 
+0

Debe hacer la excepción personalizada serializable: vea http://msdn.microsoft.com/en-us/library/vstudio/ms229064(v=vs.100).aspx – Joe

+0

qué es 'base()' en este código anterior ? – Jogi

+0

@RehanKhan Llama al constructor de la clase base ... – Servy

Cuestiones relacionadas