Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операции и выражения 40.docx
Скачиваний:
1
Добавлен:
27.09.2019
Размер:
65.19 Кб
Скачать

8) Понятие исключения:

Как показывает практика программирования, в процессе работы программы могут возникнуть какие-либо неполадки, связанные, например, с некорректными данными. В языке C# такие ситуации обрабатываются с помощью исключений. Говорят, что если операция или метод не может выполниться корректно, то выбрасываются исключения соответствующего типа. Выражение «выбрасываются» надо понимать не буквально, а в том смысле, что при обнаружении ошибки система прерывает выполнение программы и сообщает об этом. Например, если при делении делитель оказался равен нулю, то программа будет прервана с признаком «деление на нуль». А если при попытке преобразовать строку в число один из символов строки окажется не цифровым, то тоже будет прерывание программы, но уже с другим признаком. Это и есть выбрасывание исключений.

Исключения являются нормальным способом уведомления об ошибках в работе программы. Возможна стандартная обработка исключения, когда система просто информирует пользователя о случившейся неприятности и завершает выполнение программы. Однако, считается хорошим стилем, когда программист предусматривает возможность появления исключения и сам обеспечивает его обработку. Говорят, что программист «ловит» исключение, вставляя в текст программы соответствующий блок. Пример обработки исключения будет рассмотрен в одной из моих ближайших статей.

В состав библиотеки FCL (Free Class Library, библиотека свободных классов – это объектно-ориентированная библиотека, нацеленная на работу с XML, веб-программирование, взаимодействие с базами данных, обработку изображений и др.) входит класс Exception, свойства и методы которого позволяют работать с исключениями. Свойства этого класса определяют виды исключений, которые задаются определёнными идентификаторами. Если в некотором блоке предполагается возможность появления исключений, то разумно заключить этот блок в фигурные скобки и предварить ключевым словом try. Вслед за этим блоком можно расположить один или несколько блоков, обрабатывающих исключения, – это так называемые catch-блоки. Каждый catch-блок имеет формальный параметр, определяющий, какое именно исключение будет обработано в этом блоке. Если в try-блоке возникает исключение, то catch-блоки начинают конкурировать в борьбе за перехват исключения. Обрабатывает исключение тот блок, параметр которого соответствует исключению. Ну, а чтобы исключение было правильно обработано, программист должен разместить в блоке необходимые операторы.

Выражения (Expressions)

Выражение — это строка кода, которая определяет значение. Пример простого выражения:

myValue = 100;

Обратите внимание, что данная инструкция выполняет присвоение значения 100 переменной myValue. Оператор присвоения (=) не сравнивает стоящее справа от него значение (100) и значение переменной, которая находится слева от оператора (myValue). Оператор «=» устанавливает значение переменной myValue равным 100.

Поскольку myValue = 100, то как выражение, которое определяет значение 100, myValue может использоваться другим оператором присвоения.

Например:

mySecondValue = myValue = 100;

В данном выражении литеральное значение 100 присваивается переменной myValue, а затем оператором присвоения устанавливается вторая переменная mySecondValue с тем же значением 100. Таким образом, значение 100 будет присвоено обеим переменным одновременно. Инструкцией такого вида вы можете инициализировать любое число переменных с одним и тем же значением, например 20:

a = b = c = d = e = 20;

Выражения (Руководство по программированию в C#)

Выражение представляет собой последовательность из одного или нескольких операндов и от нуля до нескольких операторов, которую можно вычислить, получив в результате одно значение, объект, метод или пространство имен. Выражение может состоять из литерала, вызова метода, оператора или его операнды, а также из простого имени. В качестве простого имени может выступать имя переменной, члена типа, параметра метода, пространства имен или типа.

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

((x < 10) && ( x > 5)) || ((x > 20) && (x < 25))

System.Convert.ToInt32("35")

Значения выражений

В большинстве контекстов, в которых используются выражения, например, в операторах или в параметрах методов, предполагается, что результатом вычисления выражения будет какое-то значение. Если x и y — целые числа, то результатом вычисления выражения x + y будет числовое значение. Результатом вычисления выражения new MyClass() будет ссылка на новый экземпляр объекта MyClass. Результатом вычисления выражения myClass.ToString() является строка, поскольку она является возвращаемым типом метода. Однако хотя имя пространства имен классифицируется как выражение, значение не будет результатом его вычисления и, поэтому, оно никогда не будет конечным результатом какого-либо выражения. Имя пространства имен нельзя передать параметру метода, или использовать его в новом выражении, или присвоить его переменной. Его можно использовать только как часть выражения в более крупном выражении. Это также относится к типам (в отличие от объектов System.Type), именам групп методов (в отличие от отдельных методов) и к методам доступа к событиям add и remove.

У каждого значения есть связанный с ним тип. Например, если x и y — переменные типа int, то значение выражения x + y также типизируется как int. Если значение присвоено переменной другого типа или если x и y принадлежат к разным типам, то применяются правила преобразования типов. Дополнительные сведения о работе таких преобразований см. в разделе Приведение и преобразование типов (руководство по программированию в C#).

Переполнения

Числовые выражения могут привести к переполнениям, если значение больше максимального значения типа значения. Дополнительные сведения см. в разделах Checked и Unchecked (Справочник по C#) и Таблица явных числовых преобразований (справочник по C#).

Приоритет и ассоциативность операторов

Способ вычисления выражения управляется правилами ассоциативности и приоритетом операторов. Дополнительные сведения см. в разделе Операторы (руководство по программированию на C#).

Большинство выражений, за исключением выражений назначения и выражений вызова метода, должны быть встроены в оператор. Дополнительные сведения см. в разделе Операторы (руководство по программированию в C#).

Литералы и простые имена

Двумя наиболее простыми типами выражений являются литералы и простые имена. Литерал представляет собой постоянное значение, у которого нет имени. Например, в следующем примере 5 и "Hello World" являются литералами.

// Expression statements.

int i = 5;

string s = "Hello World";

В предыдущем примере i и s являются простыми именами, которые определяют локальные переменные. При использовании таких переменных в выражениях результатом вычисления имени переменной является значение, которое в данное время хранится в расположении переменой в памяти. Это показано в следующем примере:

int num = 5;

System.Console.WriteLine(num); // Output: 5

num = 6;

System.Console.WriteLine(num); // Output: 6

Выражения вызова

В следующем примере кода вызов метода DoWork является выражением вызова.

DoWork();

При вызове метода необходимо указать имя метода в явном виде, как было показано в предыдущем примере, или в виде результата другого выражения, после чего в скобках указываются все параметры этого метода. При вызове делегата указывается имя делегата и параметры метода в скобках. Результатом вызова метода или делегата является возвращаемое методом значение, если метод вообще возвращает значение. В качестве значений в выражениях нельзя использовать методы, возвращающие значение типа void.

Выражения запроса

Аналогичные правила в общем случае относятся и к выражениям запроса.

Лямбда-выражения

Лямбда-выражения представляют собой "встроенные методы", у которых нет имен, но которые могут иметь входные параметры и несколько инструкций. Они активно используются в LINQ для передачи параметров методам. Лямбда-выражения компилируются в делегаты или в деревья выражений в зависимости от условий, при которых они используются.

Деревья выражений

Деревья выражения позволяют представлять выражения в виде структур данных. Они активно используются поставщиками LINQ для преобразования выражений запросов в код, имеющий смысл в других контекстах, например в базах данных SQL.

Заметки

Если в выражении присутствует переменная, свойство объекта или индексатор объекта, для вычисления выражения используется значение этого элемента. В C# выражение можно использовать везде, где требуется значение или объект, если результат вычисления выражения соответствует требуемому типу.