Tentando entender as exceções em C #

Eu realmente não uso nenhuma tentativa / captura no meu código, mas estou tentando quebrar esse hábito e agora uso exceçõe

Eu acho que o lugar mais importante para tê-lo no meu aplicativo seria ler um arquivo e estou tentando implementá-lo agora, mas não tenho certeza das "melhores práticas" para fazê-lo. Atualmente estou fazendo algo assim:

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.");
}

Mas não tenho certeza se isso está correto. Eu tenho isso para lidar com isso:

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

    return;
}

// Do stuff after reading in the file..

No entanto, ao mostrar o e.Message, ele apenas mostra a mensagem de erro genérica KeyNotFoundException e não por mensagem de erro personalizada. Também não tenho certeza se, em geral, estou tratando de todo esse "problema de manipulação de exceção" corretamente. Volto na captura porque, se o arquivo não for lido com êxito, obviamente, quero apenas fingir que o usuário nunca tentou abrir um arquivo e deixá-lo tentar novamente com outro arquiv

Estou fazendo isso corretamente? Novamente, sou bastante novo no uso de exceções e quero ter certeza de que o resolvi antes de continuar e aplicar isso ao restante do meu program

Além disso, por que as pessoas dizem para não fazercatch (Exception e)? Parece que, nesse caso, eu gostaria de fazer isso porque, independentemente do erro que ocorre ao ler em um arquivo, se houver um erro, desejo parar de ler o arquivo, exibir a mensagem de erro e retornar. Não seria sempre assim? Eu posso entender que não quero lidar com a exceção e se você quiser lidar com algo diferente com base na exceção, mas, neste caso, eu não gostaria de lidar apenas com a classe de exceção básica, caso algo dê errado?

questionAnswers(7)

yourAnswerToTheQuestion