2011-03-15 26 views
21

Actualmente estoy aprendiendo C#, pero estoy atascado en algo y no puedo encontrar una solución para ello.
Estoy tratando de crear mi propia clase de excepción.¿Cómo crear una excepción de C# personalizada?

La excepción se llama "InvalidNumberException", comprueba si un número es igual a 5. Sé que puede parecer un poco estúpido, pero solo necesito tener la idea de crear excepciones personalizadas.

Hasta ahora conocer en MSDN que para la creación de la excepción que necesito estos cuatro constructores:

public class InvalidNumberException : System.Exception 
{ 
    public InvalidNumbertException() : base() { } 
    public InvalidNumberException(string message) : base(message) { } 
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { } 

    // A constructor is needed for serialization when an 
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) { } 
} 

pero no sé cómo poner en práctica el método o constructor de esta clase que un número introducido desde el la consola es igual a 5, y si no lo es, arroja una excepción.

Agradeceré si alguien me ayuda con esto.

+0

OT, no debería tener que escribir los cuatro constructores usted mismo. Simplemente implemente los que necesita. 'public class InvalidNumberException: Exception {}' debería funcionar si todo lo que vas a hacer es 'throw new InvalidNumberException();' –

+2

Vale la pena señalar que no deberías crear una excepción personalizada a menos que realmente lo necesites. Piénsalo muy cuidadosamente primero. Consulte http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx –

Respuesta

22

Usted no necesita todos esos constructores. Piense en la excepción que está creando: para asegurarse de que int es != a 5.

Por lo tanto, me gustaría tener un único constructor de la siguiente manera:

public InvalidNumberException(int value) 
    : base(String.Format("Some custom error message. Value: {0}", value)) { } 

Y utilizar de esta manera:

if (number == 5) 
    throw new InvalidNumberException(number); 

No deberías estar envolviendo que en un bloque de try. Es el trabajo del código que se ejecuta el bloque de código anterior para ver las excepciones, por ejemplo:

try 
{ 
    CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary(); 
} 
catch (InvalidNumberException inex) 
{ 
    // do something, print to console, log, etc 
} 

Estoy esperando que esto es sólo para inclinaba porque no los Int32.Parse y Int32.TryParse métodos para este propósito - una excepción personalizada clase no es requerida

27

La excepción en sí no debería hacer la comprobación. En cambio, cualquier código que tenga que funcione con el número debería hacer esto. Intentar algo como esto:

if (number == 5) 
    throw new InvalidNumberException(); 
+0

Es posible que desee pasar el número a la excepción a mostrar un mensaje significativo. –

+0

Él está hablando de verificar el número dentro de la excepción. El mensaje que muestra no está relacionado. –

4

Al arrojar una excepción se da a entender que su programa en algunas circunstancias dadas dice que no puede ejecutar normalmente y debe abortar. Usted lo hace así:

if (conditionMet) 
    throw new Exception(); 

Para ser más específico, puede utilizar las excepciones más específicas como InvalidOperationException, NullReferenceException, etc. A veces es posible que desee utilizar excepción aún más específico y eso es cuando se crea su propio tipo de excepción derivando de la base System.Exception. Piense en la excepción personalizada que crea como contenedor para la condición que tenía su programa. En su caso, la condición es que se haya pasado un número no válido, por lo que crea un contenedor InvalidNumberException que utiliza en lugar de la Excepción genérica anterior.

Cada vez que CLR ejecuta su instrucción "throw new", cancelará la ejecución de la ruta actual del código y buscará declaraciones catch que puedan manejar esa excepción.

lo que el código podría ser:

try 
{ 
    if (number == 5) 
     throw new InvalidNumberException(); 
} 
catch (InvalidNumberException e) 
{ 
    System.Console.WriteLine("Hey I got an InvalidNumberException"); 
} 
8

¡La respuesta aceptada es incorrecta!

De la respuesta aceptada:

public InvalidNumberException(int value) 
{ 
    var message = string.Format("Some custom error message. Value: {0}", value); 
    base(message, this.InnerException) 
} 

Esta es una mejor manera de hacerlo:

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { } 
+0

¿Puedes explicar por qué la respuesta aceptada es incorrecta? – numaroth

+2

La respuesta aceptada ha sido editada para usar este código –

0

No es necesariamente cierto que todas las excepciones producidas son los errores que conduzcan a abortar su aplicación - siempre que sean capturados sin filtrar, eso es;).

En el caso de una entrada de número no válido, puede recibir la excepción y luego indicar al usuario que ha ingresado un número no válido, anotar las reglas en números válidos y pedirle que vuelva a ingresar el número. Lo mismo es cierto si el usuario ingresó una contraseña mal escrita o cadena de conexión para la cuenta de la base de datos y atrapó una SqlException, o por un centenar de otros errores corregibles.

Cuestiones relacionadas