2009-12-14 17 views
19

Estoy trabajando en un desarrollo de Framework, lo que significa que requieren una metodología de codificación realmente sólida.¿Qué excepción lanzar cuando un método intenta usar un campo que puede ser nulo?

Tengo un problema donde no sé qué clase derivada de System.Exception necesito arrojar. Básicamente, el caso es cuando tengo una clase con campos que pueden ser inicializados opcionalmente por el constructor y que tienen métodos que usan estos campos. ¿Qué excepción debo lanzar si el usuario no inicializó estos campos? (Lo que significa que son nulos)

Aquí se muestra un ejemplo:

public class MyConnection 
{ 
    private Uri endpointUri; 

    public Uri EndpointUri 
    { 
     get 
     { 
      return this.endpointUri; 
     } 

     set 
     { 
      this.endpointUri = value; 
     } 
    } 

    public MyConnection() 
    { 
    } 

    public MyConnection(Uri endpointUri) 
    { 
     this.endpointUri = endpointUri; 
    } 

    public FileStream GetFile() 
    { 
     if (this.endpointUri != null) 
     { 
      // My doer methods 
     } 
     else 
     { 
      throw new TheExceptionINeedToThrow("endpointUri", ...); 
     }     
    } 
} 

Tenga en cuenta que he estado leyendo el "Framework Design Guidelines" capítulo entero en relación con el manejo de excepciones y tirar y que yo no encontré ninguna solución ajustada este caso exacta . O tal vez malentendí algo ...

Gracias por su ayuda.

EDITAR: El hecho de que proporciono un constructor vacío parece un poco confuso con respecto a mi problema, pero es completamente voluntario. En algunos objetos que tienen que cumplir con un rango de diferentes estados que no se pueden duplicar en múltiples objetos, a veces es útil.

Respuesta

39

Throw InvalidOperationException:

La excepción que se produce cuando una llamada al método no es válido para el estado actual del objeto.

Tenga en cuenta que la referencia nula no se está pasando en el método - ya está ahí cuando se llama al método - por lo que es el estado actual del objeto que no es válido, no es un argumento.

Sin embargo, sería mejor evitar que el objeto se cree de esta manera para comenzar, si es posible, ¿tiene como propiedad de escritura? ¿Alguna vez desea una instancia que hizo tiene un URI de punto final nulo?

+0

Observe el constructor predeterminado explícito, que (probablemente) implica que lo hace. – SLaks

+1

@SLaks: Lo he notado, pero estoy cuestionando su sabiduría. –

+3

¡Me estoy inclinando por deferencia a la respuesta más completa! –

1

NullReferenceException, InvalidArgumentExecption o ApplicationException todo estaría bien, siempre que la descripción de la excepción indique claramente qué es lo que es nulo.

+6

Ninguno de los que parecen apropiadas para mí, los primeros dos por razones que he dado en otro lugar; el tercero es completamente anodino en términos del tipo en sí, y la orientación generalmente es contra el uso de ApplicationException en estos días. –

+0

@Jon: Diría que la orientación es explícitamente contra ApplicationException –

+0

@Jeff: De hecho, no me sorprendería ver * algunas * recomendaciones, aunque, por eso fui un poco cauteloso :) –

1

Al igual que los demás se lo recomiendo InvalidOperationException (Debido a que Juan dijo que Skeet) :)

si se llama a una función con un parámetro nulo, voy a utilizar

ArgumentNullException

Cuestiones relacionadas