Очевидно, что многим приложениям необходимо будет работать с файлами и отображать ошибки для пользователей. Однако члены класса System.IO.File выдают много исключений. Это только для ReadAllText:C# - эта хорошая практика для упрощения исключений, созданных System.IO.File.ReadAllText
- ArgumentException
- ArgumentNullException
- PathTooLongException
- DirectoryNotFoundException
- IOException
- UnauthorizedAccessException
- FileNotFoundException
- NotSupportedException
- SecurityException
Так как поймать их и показывать их пользователю, а не глотать другие исключения?
Очевидно, что с совершенной кодирования вы можете устранить эти 2:
- ArgumentException
- ArgumentNullException
Если вы пишете (возможно болезненное) проверить можно устранить PathTooLongException. Но почему вы дублируете код для проверки того, что Microsoft написала?
Но другие исключения все еще может произойти, даже если вы сделали все проверки:
- DirectoryNotFoundException
- IOException
- UnauthorizedAccessException
- FileNotFoundException
- NotSupportedException
- SecurityException
Файлы и папки могут получить удалены во время открытия файла, разрешение безопасности можно изменить и т.д.
Я не понимаю, что вы можете сделать в этих сценариях, за исключением отображения сообщения пользователя. Вы собираетесь найти каталог, который ОС не может найти? Исправить разрешения? Ввести код в ОС, чтобы поддерживать неподдерживаемую операцию? LOL Все, что я вижу, это показать сообщение об ошибке.
Так что, если мне нужно поймать все эти исключения каждый раз, когда я открываю файл для чтения текста, мой код должен быть длинным и повторяющимся, если только я не проглатываю исключения, перехватывая исключение.
Было бы хорошей практикой, чтобы создать исключение FileException и просто уловить все исключения, которые могут возникнуть при работе с файлами? То, что я имел в виду это:
public class FileException : Exception
{
public FileException(Exception e)
: base(e.Message, e.InnerException)
{
}
}
public static class FileNoBS
{
public static string ReadAllText2(string path)
{
try
{
return File.ReadAllText(path);
}
catch (ArgumentNullException e)
{
throw new FileException(e);
}
catch (ArgumentException e)
{
throw new FileException(e);
}
catch (PathTooLongException e)
{
throw new FileException(e);
}
catch (DirectoryNotFoundException e)
{
throw new FileException(e);
}
catch (FileNotFoundException e)
{
throw new FileException(e);
}
catch (IOException e)
{
throw new FileException(e);
}
catch (UnauthorizedAccessException e)
{
throw new FileException(e);
}
catch (NotSupportedException e)
{
throw new FileException(e);
}
catch (SecurityException e)
{
throw new FileException(e);
}
}
}
Тогда при ловле исключений я бы просто написать это:
try
{
string text = FileNoBS.ReadAllText2(path);
}
catch (FileException e)
{
// display error to user
}
Я не очень понимаю, почему Microsoft не группироваться все эти исключения Снегурочка каким-то образом. Я что-то упускаю или это хорошая практика?
Но каков практический результат этого? Вы не делаете ничего конкретного для всех этих исключений. Если вам действительно нужно сделать что-то другое для каждого, вы в конечном итоге будете тестировать все одинаково. Поймайте только общее исключение и распечатайте его сообщение – Steve
Цель не в том, чтобы проглатывать исключения Я ничего не могу поделать.Я могу сделать что-то конкретное - показать пользователю, что произошла ошибка. – Marko
@Steve, то вы будете пропускать исключения StackOverflow или OutOfMemory. Текущий код фокусируется только на исключениях файлов. – Artemix