Hola, las mejoras que yo plantearía son:
Aquí parece que hay demasiadas líneas para capturar un detalle de la excepción, pero realmente ¿es tan importante el detalle?
catch (System.IO.IOException Ex)
{
Console.WriteLine(Ex.Message);
}
catch (System.OutOfMemoryException Exe)
{
Console.WriteLine(Exe.Message);
}
catch (ArgumentOutOfRangeException Exes)
{
Console.WriteLine(Exes.Message);
}
catch (OverflowException Exes)
{
Console.WriteLine(Exes.Message);
}
catch (FormatException Exes)
{
Console.WriteLine(Exes.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Yo simplemente dejaría
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Menos líneas, el programa más claro y creo que te funcionará prácticamente igual.
Más abajo has escrito int factorial = 5; pero esto no lo veo acertado. Normalmente las variables numéricas se inicializan a cero, aquí estás inicializando a 5 y eso puede confundir. Realmente da igual a qué valor inicialices porque después será sobreescrito, pero para ser más claros y no inducir confusión veo mejor inicializar a cero.
Luego hay una cosa que no estoy seguro si funciona bien: si piedes el factorial de 3 debe devolverte 1*2*3 que es 6, pero tú has puesto desde 1 hasta j<convertirValorFactorial con lo cual en vez de darte como resultado 3 te daría como resultado 2 (error porque haría 1*2 en lugar de 1*2*3). ¿Eso te funciona bien como lo tienes?