Защита от исключений (профилактическое обслуживание) при работе с вызовами сети / файловой системы? - PullRequest
3 голосов
/ 11 января 2012

У меня есть друг, который не согласен со мной по этому поводу, и я просто хочу получить отзывы о том, кто прав и неправ в этой ситуации.

FileInfo file = ...;

if (file.Exists)
{
    //File somehow gets deleted

    //Attempt to do stuff with file...
}

Проблема, на которую указывает мой друг, заключается в том, что «так что, если файл существует, когда я проверяю его существование? исключение. Так стоит ли проверять существование заранее? "

Единственное, что я могу придумать, - это то, что MSDN явно проверяет их примеры, поэтому должно быть что-то еще. MSDN - FileInfo . Но меня это интересует ... стоит ли дополнительный звонок?

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Я согласен с вашим другом здесь по большей части (контекст зависит от того, удержали ли вы соответствующую информацию из вашего вопроса).Это пример исключения, которое может возникнуть за пределами вашего великолепного кода.Проверка на наличие файла и выполнение вашей операции является условием гонки.

Дело в том, что это исключение может возникнуть, и вы НИЧЕГО не можете сделать, чтобы предотвратить его.Вы должны поймать это.Это полностью вне вашего контроля.Например, что если сеть выйдет из строя, молния поразит ваш центр обработки данных и загорится, или белка прожует кабели?Хотя нецелесообразно пытаться выяснить каждый способ, которым код будет вызывать исключение, рекомендуется делать все возможное в ситуациях, когда вы знаете, что это хорошая возможность, и прилагаете все усилия, чтобы справиться с этим.

3 голосов
/ 11 января 2012

У меня будет и if (file.Exists), и try catch. Опора только на обработку исключений не выражает явно то, что вы имеете в виду. if (file.Exists) говорит само за себя.

Если кто-то удаляет файл в течение этой миллисекунды между проверкой и работой с файлом, вы все равно можете получить исключение. Тем не менее, существуют и другие условия, которые могут привести к исключению: файл доступен только для чтения; у вас нет запрошенных разрешений безопасности и многое другое.

0 голосов
/ 11 января 2012

Я бы сказал, что это зависит от контекста. если файл был только что создан, а затем этот процесс запущен, то нет смысла проверять, существует ли он. Вы можете предположить, что это происходит, потому что код все еще выполняется.

однако, если этот файл постоянно удаляется и создается, то да, имеет смысл убедиться, что он существует, прежде чем продолжить.

еще один фактор - кто / что обращается к файлу. если к файлу обращаются несколько клиентов, то существует большая вероятность того, что файл будет изменен / удален, и поэтому имеет смысл проверить, существует ли файл.

...