Имеет ли функция ReadAllLines () встроенную функцию try-catch? - PullRequest
2 голосов
/ 05 июля 2011

Насколько я понимаю, ReadAllLines откроет файл, а затем вернет все строки в этом файле, а затем закроет этот файл / поток. Теперь у меня есть этот кусок кода:

try
{
    string[] lines = File.ReadAllLines(path);
}
catch(IOException)
{
    Console.WriteLine("File doesnt exist in : " + path);
}

Я сделал это так, что если файл в каталоге path не существует, он выдаст сообщение об ошибке. Мой вопрос: это необходимо? Так как я не знаю, как ReadAllLines () был реализован Microsoft, я действительно не знаю, имел ли он уже встроенный уловик try в реализации функции ..

Однако я могу «догадаться», что ReadAllLines () всегда будет закрывать файловый поток каждый раз, когда он заканчивает чтение. по этой причине я не запустил код cleanup , который должен быть включен в блок finally{}.

Может кто-нибудь объяснить / дать мне подтверждение об этом? Любая помощь будет оценена. Дайте мне знать, если вопрос не ясен. Спасибо.

Ответы [ 7 ]

3 голосов
/ 05 июля 2011

Я посмотрел на источник в ILSpy, и похоже, что он делает следующее:

[SecuritySafeCritical]
public static string[] ReadAllLines(string path)
{
if (path == null)
{
    throw new ArgumentNullException("path");
}
if (path.Length == 0)
{
    throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
}
return File.InternalReadAllLines(path, Encoding.UTF8);
}

И метод InternalReadAllLines:

private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader streamReader = new StreamReader(path, encoding))
{
    string item;
    while ((item = streamReader.ReadLine()) != null)
    {
        list.Add(item);
    }
}
return list.ToArray();
}
2 голосов
/ 05 июля 2011

Документация здесь содержит список исключений, которые будут вызываться ReadAllLines при различных обстоятельствах.Все перечисленные исключения приведут к тому, что файл не будет открыт, поэтому код очистки в блоке finally не требуется, но вы определенно хотите перехватить любые исключения, которые могут возникнуть в вашем контексте.

2 голосов
/ 05 июля 2011

Чтение документации по методу File.ReadAllLines() помогает - там перечислены все исключения, которые могут быть выброшены, - включая IOException и FileNotFoundException.

1 голос
/ 05 июля 2011

Вы можете посмотреть документацию msdn метода, которая включает в себя объяснение того, какие исключения будут выброшены и при каких обстоятельствах:

http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx

Исключение ArgumentException
путь является строкой нулевой длины, содержит только пробел или содержит один или несколько недопустимых символов, как определено InvalidPathChars.

FileNotFoundException
Файл, указанный в пути, не найден.

1 голос
/ 05 июля 2011

Да, в документации сказано, что выбрасывает:

http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx

1 голос
/ 05 июля 2011

Если файл не существует в конце этого пути, или если файл заблокирован и т. Д., Тогда да, File.ReadAllLines(path) сгенерирует исключение, и вы вправе предполагать использовать блок try catch.

1 голос
/ 05 июля 2011

Да, он выдает исключение, если не найден и т. Д. Просто введите File.ReadAllLines, и intellisense покажет вам все исключения, которые метод может вызвать. И да, он очищается, вам не нужно беспокоиться о внутренних потоках и т. Д., Если это вас беспокоит.

...