Tengo un problema simple en mi proyecto (Servicio de Windows basado en C #) que simplemente no puedo entender.
En varias clases de mi aplicación necesito cargar un intervalo (lapso de tiempo), desde la configuración de la aplicación. En el archivo de configuración, este intervalo de tiempo se almacena como una cadena, como "1d8h". Obviamente, la aplicación necesita analizar esta cadena antes de poder usar el intervalo de tiempo. En un caso, estoy pasando esta cadena como argumento a un constructor mientras inicializo varios objetos que tienen su propio lapso de tiempo. En el constructor, analizo esta cadena y lanzo una ArgumentException si el análisis falla por cualquier motivo.
En algún otro lugar de mi aplicación, necesito hacer exactamente lo mismo, pero esta vez en un constructor estático que no puede tener ningún argumento. En este caso, estoy lanzando una System.Configuration.ConfigurationErrorsException porque no estoy trabajando con ningún argumento, por lo que lanzar una ArgumentException no sería correcto en este caso.
¿Está perfectamente bien lanzar diferentes excepciones en ambos casos, a pesar de que sean causadas exactamente por la misma operación? Si no, ¿qué debo hacer en su lugar?
Sugiero usar FormatException en ambos casos.
Como dijiste, ArgumentException señala un problema con un argumento, generalmente su tipo o tipo (mientras que ArgumentNullException se usa específicamente para argumentos nulos). Por lo tanto, ninguno es aceptable en un constructor estático que no acepta argumentos.
FormatException encaja muy bien. Señala un problema con el formato del argumento en sí, más que con su tipo o clase. Lo lanzan la mayoría de los métodos .Parse() nativos de C#, como DateTime.Parse()