Компонентный подход в программировании


         

Блок обработки исключительных ситуаций выглядит


  • Блок обработки исключительных ситуаций выглядит так:

    try { statements } Ag catch ( type_1 e_1 ) { statements_1 } Ag … Ag catch ( type_n e_n ) { statements_n } Ag finally { statements_f } Ag

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

    Блок finally выполняется всегда — сразу после блока try, если исключения не возникло, или сразу после обрабатывавшего исключение блока catch, даже если он выбросил новое исключение.

    В этой конструкции могут отсутствовать блоки catch или блок finally, но не то и другое одновременно. В C# разрешается опускать имя объекта-исключения в catch, если он не используется при обработке соответствующей исключительной ситуации.

  • public class A { public static void main(String[] args) { try { if(args.length > 0) System.out.println ("Some arguments are specified"); else throw new IllegalArgumentException ("No arguments specified"); } catch(RuntimeException e) { System.out.println ("Exception caught"); System.out.println ("Exception type is " + e.getClass().getName()); System.out.println ("Exception message is \"" + e.getMessage() + "\""); } finally { System.out.println ("Performing finalization"); } } }using System;

    public class A { public static void Main(string[] args) { try { if(args.Length > 0) Console.WriteLine ("Some arguments are specified"); else throw new ArgumentException ("No arguments specified"); } catch(Exception e) { Console.WriteLine ("Exception caught"); Console.WriteLine ("Exception type is " + e.GetType().FullName); Console.WriteLine ("Exception message is \"" + e.Message + "\""); } finally { Console.WriteLine ("Performing finalization"); } } }


    В Java, начиная с версии 1.4, появилась инструкция assert, предназначенная для выдачи отладочных сообщений.

    Эта инструкция имеет один из двух видов:

    assert expression ; assert expression : expression_s ;

    Выражение expression должно иметь логический тип, а выражение expression_s — произвольный.

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

    Если проверка утверждений включена, то вычисляется значение expression. Если оно равно true, управление переходит дальше, иначе в обоих случаях выбрасывается исключение java.lang.AssertionError.

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



    В C# имеется возможность использовать инструкцию goto. Эта инструкция передает управления на инструкцию, помеченную меткой, которая следует за goto.

    Как мы уже видели, помимо обычных меток, в goto могут использоваться метки case вместе со значениями и метка default. В этих случаях инструкция goto должна находиться внутри блока switch, в котором имеются эти метки.

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



    Ключевые слова checked и unchecked в C# могут помечать блок, определяя тем самым контекст вычислений в рамках этого блока (см. раздел о целочисленных типах).



    Инструкция using может быть использована в C#, чтобы выполнить действия, требующие захвата каких-либо ресурсов, без необходимости заботиться потом об их освобождении.

    Эта инструкция имеет вид:

    using ( expression ) statement или using ( declaration ) statement

    где declaration — это декларация одной или нескольких переменных.

    Первый вид этой инструкции сводится ко второму — если тип используемого выражения T, и имя v нигде не используется, то он эквивалентен

    using ( T v = expression ) statement Эта конструкция, в свою очередь, эквивалентна следующей. { T v = expression; try { statement } finally { disposal } }

    Здесь disposal представляет вызов метода Dispose(), который должен быть у типа T, с возможной предварительной проверкой того, что переменная v не равна null, и приведением ее к типу System.IDisposable, если T является его подтипом.



    В версии 2.0 в C# введены две инструкции yield, предназначенные для более удобного построения итераторов.

    Блок, содержащий инструкцию yield, называется итерационным (iterator block) и может быть телом метода, оператора или метода доступа к свойству и не должен быть блоком finally, catch или блоком try, у которого есть соответствующие catch-блоки. Этот блок порождает последовательность значений одного типа. Сам метод или оператор должен возвращать объект одного из четырех типов:

    System.Collections.IEnumerable, System.Collections.IEnumerator, System.Collections.Generic.IEnumerable <T>, System.Collections.Generic.IEnumerator <T>.

    В первых двух случаях порождаются объекты типа object, во вторых двух — значения типа T.

    Для возвращения одного из этой последовательности значений используется инструкция yield return expression; Выражение в ней должно иметь соответствующий тип, object или T.

    Для указания на то, что порождаемая итерационным блоком последовательность значений завершилась, используется инструкция yield break;

    Пример реализации итератора коллекции с использованием yield приведен ниже.

    using System;

    public class MyArrayList<T> { T[] items = new T[10]; int size = 0;

    public int Count { get { return size; } }

    public T this[int i] { get { if(i < 0 || i >= size) throw new IndexOutOfRangeException(); else return items[i]; } set { if(i < 0 || i > size) throw new IndexOutOfRangeException(); else if (i == size) { T[] newItems = new T[size + 10]; Array.Copy (items, newItems, size++); } items[i] = value; } }

    public IEnumerator<T> GetEnumerator () { for(int i = 0; i < size; i++) yield return items[i]; } }

    public class A { public static void Main() { MyArrayList<string> l = new MyArrayList<string>();

    l[0] = "First"; l[1] = "Second"; l[2] = "Third";

    foreach (string s in l) Console.WriteLine(s); } }


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


    Содержание  Назад  Вперед