Intentando entender excepciones en C #

Realmente no uso ningún intento / capturas en mi código, pero estoy tratando de romper ese hábito y ahora uso excepciones.

Creo que el lugar más importante para tenerlo en mi aplicación sería leer un archivo y estoy tratando de implementarlo ahora, pero no estoy seguro de las "mejores prácticas" para hacerlo. Actualmente estoy haciendo algo como esto:

private void Parse(XDocument xReader)
{
    IEnumerable<XElement> person = xReader.Descendants("Person").Elements();

    foreach (XElement e in person)
        personDic[e.Name.ToString()] = e.Value;

    if (personDic["Name"] == null || personDic["Job"] == null || personDic["HairColor"] == null)
        throw new KeyNotFoundException("Person element not found.");
}

Pero no estoy seguro si esto es correcto. Tengo esto para manejarlo:

try
{
    personsReader.Read(filename, persons);
}
catch (KeyNotFoundException e)
{
    MessageBox.Show(e.Message);

    return;
}

// Do stuff after reading in the file..

Sin embargo, cuando se muestra e.Message, solo muestra el mensaje de error genérico KeyNotFoundException y no por mensaje de error personalizado. Además, no estoy seguro de si, en general, estoy abordando todo este "asunto de manejo de excepciones" correctamente. Regreso en la captura porque si el archivo no se lee con éxito, obviamente, solo quiero fingir que el usuario nunca intentó abrir un archivo y dejar que lo intente nuevamente con otro archivo.

¿Estoy haciendo esto correctamente? Nuevamente, soy bastante nuevo en el uso de excepciones y quiero asegurarme de que lo logré justo antes de continuar y aplicar esto al resto de mi programa.

Además, ¿por qué la gente dice que no se debe hacercatch (Exception e)? Parece que en este caso me gustaría hacer eso porque, independientemente de qué error ocurra al leer un archivo, si hay un error, quiero dejar de leer el archivo, mostrar el mensaje de error y regresar. ¿No sería ese siempre el caso? Puedo entender que no quiero manejar la Excepción e si quisieras manejar algo diferente basado en la excepción, pero en este caso, ¿no querría manejar la clase de excepción base en caso de que algo salga ma

Respuestas a la pregunta(7)

Su respuesta a la pregunta