Обратите внимание на то, что в приведенной выше программе применяются два блокаtry.В первом из них перехватываются исключения, возникающие при вводе-выводе и способные воспрепятствовать открытию файла. Если произойдет ошибка ввода-вывода, выполнение программы завершится. В противномслучаево втором блокеtryбудет продолжен контроль исключений, возникающих в операциях ввода-вывода. Следовательно, второй блокtryвыполняется только в том случае, если в переменнойfinсодержится ссылка на открытый файл. Обратите также внимание на то, что файл закрывается в блокеfinally,связанном со вторым блокомtry.Это означает, что независимо от того, как завершится циклdo-while(нормально или аварийно из-за ошибки), файл все равно будет закрыт. И хотя в данном конкретном примере это и так важно, поскольку программа все равно завершится в данной точке, преимущество такого подхода, вообще говоря, заключается в том, что файл закрывается в завершающем блокеfinallyв любом случае — даже если выполнение кода доступа к этому файлу завершается преждевременно из-за какого-нибудь исключения.

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

// Отобразить содержимое текстового файла.

using System; using System.10;

class ShowFile {

static void Main(string[] args) { int i;

FileStream fin = null;

if (args.Length != 1)' {

Console.WriteLine("Применение: ShowFile File"); return;

}

try {

fin = new FileStream(args[0], FileMode.Open);

// Читать байты до конца файла, do {

i = fin.ReadByte();

if(i != -1) Console.Write((char) i);

} while (i != -1);

} catch(IOException exc) {

Console.WriteLine("Ошибка ввода-вывода:\n" + exc.Message);

} finally {

if(fin != null) fin.Close();

}

}

}

Перейти на страницу:

Похожие книги