c# - ¿ArgumentException vs. ArgumentNullException?
.net (4)
Aunque estoy completamente de acuerdo con la respuesta de dasblinkenlight , es posible que también desee considerar mover la validación de FooArgs
a la FooArgs
clase de FooArgs
. Si esta clase está diseñada específicamente para mover los argumentos, es probable que no sea válida para que tenga un valor nulo, en cuyo caso, permitiría que el constructor realice su validación.
Estoy refactorizando algo de código y agregando un método que reemplazará un método en desuso. El nuevo método tiene la siguiente firma:
FooResult Foo(FooArgs args) { ... }
El método en desuso contenía una lista creciente de parámetros. Estos parámetros ahora son propiedades en la clase FooArgs
. El método en desuso tiene varias condiciones de guarda que verificaron los valores nulos con la siguiente estructura:
if (parameter1 == null)
throw new ArgumentNullException(“parameter1”);
if (parameter... == null)
throw new ArgumentNullException(“parameter...”);
if (parameterN == null)
throw new ArgumentNullException(“parameterN”);
Ahora que los parámetros se han contraído en la clase FooArgs
, debo lanzar una FooArgs
ArgumentNullException para las propiedades individuales del parámetro FooArgs
:
if (args.Property1 == null)
throw new ArgumentNullException(“args.Property1”);
if (args.Property... == null)
throw new ArgumentNullException(“args.Property...”);
if (args.PropertyN == null)
throw new ArgumentNullException(“args.PropertyN”);
O para lanzar una ArgumentException más general para todo el parámetro FooArgs
:
if (args.Property1 == null)
throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
throw new ArgumentException(“Property2 cannot be null.”, “args”);
¡Gracias!
Debe agregar una comprobación para que los argumentos en sí no sean nulos. El ANE no es apropiado para componentes individuales, por lo que necesita usar un AE más general, como este:
if (args == null)
throw new ArgumentNullException(“args”);
if (args.Property1 == null)
throw new ArgumentException(“Property1 cannot be null.”, “args”);
if (args.Property... == null)
throw new ArgumentException(“Property... cannot be null.”, “args”);
if (args.PropertyN == null)
throw new ArgumentException(“Property2 cannot be null.”, “args”);
En este caso, puede ser mejor buscar una referencia nula del parámetro FooArgs
dentro de ese método y lanzar una ArgumentNullException
si se ha pasado una referencia nula. Luego, si otros métodos o secciones de código usan los parámetros contenidos dentro de los argumentos. clase, deben ser los que verifiquen esto y arrojar excepciones según sea necesario. Sin embargo, si su método que utiliza la clase args es el que usa todos los argumentos, entonces sería mejor verificar los parámetros válidos en ese método, como sugirió.
Además, use ArgumentNullException
solo para los argumentos que son referencias nulas. Si es simplemente un valor no válido (por ejemplo, una cadena vacía), entonces debería usar la ArgumentException
más genérica.
Esto depende de su herramienta y de cómo se siente con respecto a ella (resharper, fxcops y similares). Algunas herramientas de análisis de código estático aceptan esto:
throw new ArgumentNullException(“args.Property...”,"args");
y rechazar esto
throw new ArgumentNullException(“args.Property...”,"args.Property");
Entonces, si desea usar las herramientas, entonces las aserciones de null-hood contra una propiedad de parámetro deben lanzar una ArgumentException
También es válido hacerlo solo a medida que avanzas. Lo que siempre comunica el mensaje correcto al desarrollador de mantenimiento para ayudarlo a pasar los parámetros correctamente es el mensaje correcto.