This question is close to what I want to do, pero no del todo allí.¿Puede atrapar más de un tipo de excepción con cada bloque?
¿Hay alguna manera de simplificar el siguiente código?
private bool ValidDirectory(string directory)
{
if (!Directory.Exists(directory))
{
if (MessageBox.Show(directory + " does not exist. Do you wish to create it?", this.Text)
== DialogResult.OK)
{
try
{
Directory.CreateDirectory(directory);
return true;
}
catch (IOException ex)
{
lblBpsError.Text = ex.Message;
}
catch (UnauthorizedAccessException ex)
{
lblBpsError.Text = ex.Message;
}
catch (PathTooLongException ex)
{
lblBpsError.Text = ex.Message;
}
catch (DirectoryNotFoundException ex)
{
lblBpsError.Text = ex.Message;
}
catch (NotSupportedException ex)
{
lblBpsError.Text = ex.Message;
}
}
}
return false;
}
Parece un desperdicio, y si más adelante desea cambiar la forma puedo informar de un error de nuevo al usuario, o tal vez quiero registrar estos errores, o lo que sea, entonces tengo que cambiar 5 diferentes atrapar bloques. ¿Me estoy perdiendo algo, o esto es descaradamente contra la reutilización del código?
¿Solo trato de ser (demasiado) vago?
Esto podría simplificarse un poco: elimine DirectoryNotFoundException y PathTooLongException porque (por ejemplo, IOException) devolverá true para ellos –
No, no lo hará. El operador 'is' es muy exacto, no volverá a ser verdadero para las subclases, solo esa clase exacta. Pensé esto también, luego lo probé en LINQPad. –
Matthew, el siguiente código de prueba devuelve verdadero. No estoy seguro de por qué tienes el resultado diferente ... try { throw new DirectoryNotFoundException(); } catch (Exception ex) { return (ex is IOException); } –