Обработка исключений

Приведение числовых типов

Приведение числовых типов подчиняется примерно тем же правилам, что и приведение классов. Если вы пытаетесь привести «больший» числовой тип к «меньшему» (например, int — в byte), необходимо провести явное преобразование:

 

int х = 30000;

byte b -= (byte)x; // Возможна потеря данных

 

Нас можно поздравить: теперь мы уже умеем создавать сложные иерархии пользовательских типов в С#. Но прежде чем перейти к ним, мы должны рассмотреть еще два аспекта, тесно связанных с проектированием классов: обработку ошибок и управление памятью.

В течение множества лет обработка ошибок превращалась разработчиками, использующими Windows, в сложную смесь различных приемов. Множество программистов реализовывало свою собственную логику обработки ошибок в рамках одно-го-единственного конкретного приложения. Например, команда разработчиков могла определить свой набор констант для представления известных условий возникновения ошибок и использовать их как значения, возвращаемые методами. Помимо этого в Windows API было определено большое количество кодов ошибок, которые должны были обрабатываться при помощи #define, HRESULTS и множества прочих средств. Многие СОМ-разработчики использовали набор стандартных СОМ-интерфейсов для возвращения значимой информации об ошибках клиентам СОМ.

Очевидная проблема всех этих приемов обработки ошибок заключается в том, что все они — разные. Каждый прием привязан к конкретной технологии, конкретному языку или конкретному проекту. Чтобы наконец навести порядок во всем этом, .NET предлагает единую технику для обнаружения ошибок времени выполнения и передачи сообщений о них: это — структурированная обработка исключений (Structured Exception Handling, SEH).

Преимущества этого метода заключаются в том, что в распоряжение всех разработчиков предоставляется единый и хорошо продуманный подход к обработке ошибок, который к тому же является общим для всех языков .NET. Таким образом, разработчик, использующий С#, будет реализовывать обработку ошибок точно так же, как программист, использующий VB.NET или МС++, и все остальные разработчики, использующие платформу .NET. Разработчики также получают дополнительную возможность генерировать и перехватывать исключения между двоичными файлами, AppDomains (о них будет сказано — в главе 6) и компьютерами в независимом от языка стиле.

Для того чтобы понять, как применять исключения в С#, в первую очередь необходимо осознать, что исключения в С# —^это объектьь_Все системные и пользовательские исключения в С# производятся от класса System Exception (который, в свою очередь, производится от класса System Object). В табл. 3.1 представлен перечень наиболее интересных свойств класса Exception.