Деление на нуль приведет к исключительной ситуации.



Попытка деления на нуль.

 

Начинающие программисты порой испытывают затруднения при использовании потока Console.Error. Перед ними невольно встает вопрос: если оба потока, Console.Out и Console.Error, по умолчанию выводят результат на консоль, то зачем нужны два разных потока вывода? Ответ на этот вопрос заключается в том, что стандартные потоки могут быть переадресованы на другие устройства. Так, поток Console.Error можно переадресовать в выходной файл на диске, а не на экран. Это, например, означает, что сорбщения об ошибках могут быть направлены в файл журнала регистрации, не мешая выводу на консоль. И наоборот, если вывод на консоль переадресуется, а вывод сообщений об ошибках остается прежним, то на консоли появятся сообщения об ошибках, а не выводимые на нее данные. Мы еще вернемся к вопросу переадресации после рассмотрения файлового ввода-вывода.

 

 

Класс FileStream и байтовый ввод-вывод в файл

 

В среде .NET Framework предусмотрены классы для организации ввода-вывода в файлы. Безусловно, это в основном файлы дискового типа. На уровне операционной системы файлы имеют байтовую организацию. И, как следовало ожидать, для ввода и вывода байтов в файлы имеются соответствующие методы. Поэтому ввод и вывод в файлы байтовыми потоками весьма распространен. Кроме того, байтовый поток ввода или вывода в файл может быть заключен в соответствующий объект символьного потока. Операции символьного ввода-вывода в файл находят применение при обработке текста. О символьных потоках речь пойдет далее в этой главе, а здесь рассматривается байтовый ввод-вывод.

Для создания байтового потока, привязанного к файлу, служит класс FileStream. Этот класс является производным от класса Stream и наследует всего его функции.

Напомним, что классы потоков, в том числе и FileStream, определены в пространстве имен System.IO. Поэтому в самом начале любой использующей их программы обычно вводится следующая строка кода.

 

using System.IO;

 

 

Открытие и закрытие файла

 

Для формирования байтового потока, привязанного к файлу, создается объект класса FileStream. В этом классе определено несколько конструкторов. Ниже приведен едва ли не самый распространенный среди них:

 

FileStream(string путь, FileMode режим)

 

где путь обозначает имя открываемого файла, включая полный путь к нему; а режим — порядок открытия файла. В последнем случае указывается одно из значений, определяемых в перечислении FileMode и приведенных в табл. 14.4. Как правило, этот конструктор открывает файл для доступа с целью чтения или записи. Исключением из этого правила служит открытие файла в режиме FileMode.Append, когда файл становится доступным только для записи.

 

Таблица 14.4. Значения из перечисления FileMode

 

FileMode.Append - Добавляет выводимые данные в конец файла

FileMode.Create - Создает новый выходной файл. Существующий файл с таким же именем будет разрушен

FileMode.CreateNew - Создает новый выходной файл. Файл с таким же именем не должен существовать

FileMode.Open - Открывает существующий файл

FileMode.OpenOrCreate - Открывает файл, если он существует. В противном случае создает новый файл

FileMode.Truncate - Открывает существующий файл, но сокращает его длину до нуля

 

Если попытка открыть файл оказывается неудачной, то генерируется исключение. Если же файл нельзя открыть из-за того что он не существует, генерируется исключение FileNotFoundException. А если файл нельзя открыть из-за какой-нибудь ошибки ввода-вывода, то генерируется исключение IOException. К числу других исключений, которые могут быть сгенерированы при открытии файла, относятся следующие: ArgumentNullException (указано пустое имя файла), ArgumentException (указано неверное имя файла), ArgumentOutOfRangeException (указан неверный режим), SecurityException (у пользователя нет прав доступа к файлу), PathTooLongException (слишком длинное имя файла или путь к нему), NotSupportedException (в имени файла указано устройство, которое не поддерживается), а также DirectoryNotFoundException (указан неверный каталог).

Исключения PathTooLongException, DirectoryNotFoundException и FileNotFoundException относятся к подклассам класса исключений IOException. Поэтому все они могут быть перехвачены, если перехватывается исключение IOException.

 

Ниже в качестве примера приведен один из способов открытия файла test.dat для ввода.

 

FileStream fin;

try {

fin = new FileStream("test", FileMode.Open);

}

catch(IOException exc) { // перехватить все исключения, связанные с вводом-выводом

Console.WriteLine(exc.Message);

Обработать ошибку.

}

catch(Exception exc { // перехватить любое другое исключение.

Console.WriteLine(exc.Message);


Дата добавления: 2019-02-12; просмотров: 256; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!