This question is close to what I want to do, ale nie do końca.Czy można złapać więcej niż jeden typ wyjątku dla każdego bloku?
Czy istnieje sposób na uproszczenie następującego kodu?
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;
}
Wydaje się odpady, a jeśli później chcą zmienić sposób mogę zgłosić błąd z powrotem do użytkownika, czy może chcę zalogować się tych błędów, czy cokolwiek, to muszę zmienić 5 różnych łapać bloki. Czy czegoś brakuje, czy też jest to rażąco przeciwko ponownemu użyciu kodu?
Czy staram się być (zbyt) leniwy?
To może być nieco uproszczone - usuń DirectoryNotFoundException i PathTooLongException, ponieważ (ex jest wyjątek IOException) zwróci true dla nich –
Nie, nie będzie. Operator 'is' jest bardzo dokładny, nie zwróci wartości true dla podklas, tylko ta dokładna klasa. Też to pomyślałem, a potem przetestowałem w LINQPad. –
Matthew, następujący kod testowy zwraca true. Nie jestem pewien, dlaczego masz inny wynik ... spróbuj { rzucić nowy DirectoryNotFoundException(); } catch (Exception ex) { return (ex jest wyjątkiem IOException); } –