Главная страница
Навигация по странице:

  • Табл. 5.1. Некоторые классы исключенийКласс Описание

  • Результат выполнения программы (из листинга 5.2)

  • Результат выполнения программы (из листинга 5.3)

  • Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование


    Скачать 5.54 Mb.
    НазваниеВасильев А. Н. Программирование
    АнкорВасильев А.Н. Основы программирования на C
    Дата20.09.2022
    Размер5.54 Mb.
    Формат файлаpdf
    Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
    ТипДокументы
    #686596
    страница19 из 40
    1   ...   15   16   17   18   19   20   21   22   ...   40
    Результат выполнения программы (из листинга 5.1)
    ɇɚɱɢɧɚɟɬɫɹ ɜɵɩɨɥɧɟɧɢɟ ɩɪɨɝɪɚɦɦɵ
    ɉɟɪɟɦɟɧɧɚɹ A=10
    ɉɟɪɟɦɟɧɧɚɹ B=2
    Глава 5
    234
    ȼɵɱɢɫɥɹɟɬɫɹ ɜɵɪɚɠɟɧɢɟ A/B
    Ɋɟɡɭɥɶɬɚɬ: 5
    ȼɵɱɢɫɥɟɧɢɹ ɡɚɤɨɧɱɟɧɵ
    ɉɪɨɝɪɚɦɦɚ ɡɚɜɟɪɲɢɥɚ В этом случае при выполнении блока ошибок не возникает. Поэтому выполняются все команды в блоке, а команды в блоке игнорируются.
    Основные классы исключений Чего-нибудь не так Все так. Только Земля далеко.
    из к/ф «Кин-дза-дза»
    Как отмечалось выше, существует целая иерархия классов, описывающих различные исключительные ситуации. Большинство практически важных классов исключений содержатся в пространстве имен System. На вершине иерархии наследования классов находится класс Exception. Производными от класса Exception являются классы SystemException и ApplicationException. Класс
    SystemException является базовым для классов исключений, соответствующих системным ошибкам. Класс ApplicationException обычно используют для создания пользовательских исключений (этот вопрос рассматривается немного позже. В табл. 5.1 приведены некоторые классы исключений, которые нередко используются на практике.
    Табл. 5.1. Некоторые классы исключений
    Класс
    Описание
    ArgumentException
    Исключение, связанное с некорректным аргументом
    ArithmeticException
    Исключение, связанное с выполнением арифметических операций. У этого класса имеется три производных класса
    DivideByZeroException (ошибка деления на ноль, NotFiniteNumberException (получено бесконечное значение) и OverflowException ошибка, связанная с переполнением)
    ArrayTypeMismatchException
    Исключение, связанное с попыткой записать в массив значение недопустимого типа
    Обработка исключений
    235
    FormatException
    Исключение, обусловленное недопустимым форматом, связанное с выходом индекса за допустимые пределы
    InvalidCastException
    Исключение, обусловленное недопустимым преобразованием типов
    InvalidProgramException
    Исключение, связанное с неправильной компиляцией программы
    MemberAccessException
    Исключение, обусловленное неудачной попыткой доступа к члену класса. У класса этого исключения есть три производных класса
    FieldAccessException (ошибка доступа к полю, MethodAccessException (ошибка доступа к методу) и MissingMemberException отсутствует член класса)
    NotImplementedException
    Исключение, связанное с попыткой выполнить нереализованный метод или операцию
    NotSupportedException
    Исключение, связанное с попыткой выполнения неподдерживаемого метода или операции
    NullReferenceException
    Исключение, связанное с использованием пустой ссылки
    OutOfMemoryException
    Исключение, связанное с недостаточным объемом памяти
    RankException
    Исключение, связанное с передачей массива неправильной размерности
    StackOverflowException
    Исключение, связанное с переполнением стека
    TimeoutException
    Исключение, связанное с окончанием времени, выделенного на выполнение процесса или операции Конечно, это лишь небольшая часть классов исключений. В действительности иерархия классов наследования более чем обширна, она содержит самые разнообразные классы, так сказать, на все случаи жизни. Конкретные классы мы будем использовать и обсуждать по мере необходимости. А далее рассмотрим пример, в котором при выполнении программы генерируются (и обрабатываются) исключения разных типов. Обратимся к программному коду в листинге Листинг 5.2. Исключения разных типов System;
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class UsingExceptionsDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    Глава 5
    236
    //
    Ɉɛɴɟɤɬ ɞɥɹ ɝɟɧɟɪɢɪɨɜɚɧɢɹ ɫɥɭɱɚɣɧɵɯ ɱɢɫɟɥ:
    Random rnd=new Random();
    //
    ɉɟɪɟɦɟɧɧɚɹ ɦɚɫɫɢɜɚ:
    int[] nums;
    //
    ɐɟɥɨɱɢɫɥɟɧɧɵɟ ɩɟɪɟɦɟɧɧɵɟ:
    int x,n;
    //
    Ɉɩɟɪɚɬɨɪ ɰɢɤɥɚ:
    for(int k=1;k<10;k++){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɧɨɦɟɪɚ ɰɢɤɥɚ:
    Console.Write(
    Ǝ[{0}] Ǝ,k);
    //
    ɇɚɱɚɥɶɧɨɟ ɡɧɚɱɟɧɢɟ ɩɟɪɟɦɟɧɧɨɣ (ɧɨɦɟɪ ɤɨɦɚɧɞɵ):
    n=1;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɛɥɨɤ ɤɨɞɚ:
    try{
    //
    Ʉɨɦɚɧɞɚ ʋ1. ɉɨɩɵɬɤɚ ɫɨɡɞɚɬɶ ɦɚɫɫɢɜ:
    nums=new int[2*rnd.Next(3)-1];
    //
    ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɫɱɟɬɱɢɤɚ ɤɨɦɚɧɞ:
    n++;
    //
    Ʉɨɦɚɧɞɚ ʋ2. ɉɨɩɵɬɤɚ ɜɵɱɢɫɥɢɬɶ ɱɚɫɬɧɨɟ:
    x=1/rnd.Next(3);
    //
    ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɫɱɟɬɱɢɤɚ ɤɨɦɚɧɞ:
    n++;
    //
    Ʉɨɦɚɧɞɚ ʋ3. ɉɨɩɵɬɤɚ ɩɪɢɫɜɨɢɬɶ ɡɧɚɱɟɧɢɟ
    //
    ɷɥɟɦɟɧɬɭ ɦɚɫɫɢɜɚ:
    nums[rnd.Next(2)-1]=x;
    //
    ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɫɱɟɬɱɢɤɚ ɤɨɦɚɧɞ:
    n++;
    //
    Ʉɨɦɚɧɞɚ ʋ4. Ɉɲɢɛɤɚ ɩɪɟɨɛɪɚɡɨɜɚɧɢɹ:
    nums[0]=Int32.Parse(
    ƎɧɨɥɶƎ);
    }
    //
    Ȼɥɨɤ ɨɛɪɚɛɨɬɤɢ ɢɫɤɥɸɱɟɧɢɣ:
    catch(Exception e){
    Обработка исключений //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɧɨɦɟɪɚ ɤɨɦɚɧɞɵ ɫ ɨɲɢɛɤɨɣ:
    Console.Write(
    ƎɄɨɦɚɧɞɚ ʋ{0}: Ǝ,n);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɬɢɩɚ (ɤɥɚɫɫɚ) ɢɫɤɥɸɱɟɧɢɹ:
    Console.Write(e.GetType().Name);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɨɩɢɫɚɧɢɹ ɞɥɹ ɢɫɤɥɸɱɟɧɢɹ:
    Console.WriteLine(
    Ǝ - Ǝ+e.Message);
    }
    }
    Возможный результат выполнения программы (с поправкой на то, что используется генератор случайных чисел) представлен ниже:
    
    Результат выполнения программы (из листинга 5.2)
    [1]
    Ʉɨɦɚɧɞɚ ʋ3: IndexOutOfRangeException — ɂɧɞɟɤɫ ɧɚɯɨɞɢɥɫɹ ɜɧɟ ɝɪɚɧɢɰ ɦɚɫɫɢɜɚ.
    [2]
    Ʉɨɦɚɧɞɚ ʋ2: DivideByZeroException — ɉɨɩɵɬɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɭɥɶ.
    [3]
    Ʉɨɦɚɧɞɚ ʋ3: IndexOutOfRangeException — ɂɧɞɟɤɫ ɧɚɯɨɞɢɥɫɹ ɜɧɟ ɝɪɚɧɢɰ ɦɚɫɫɢɜɚ.
    [4]
    Ʉɨɦɚɧɞɚ ʋ1: OverflowException — ɉɟɪɟɩɨɥɧɟɧɢɟ ɜ ɪɟɡɭɥɶɬɚɬɟ ɜɵɩɨɥɧɟɧɢɹ
    ɚɪɢɮɦɟɬɢɱɟɫɤɨɣ ɨɩɟɪɚɰɢɢ.
    [5]
    Ʉɨɦɚɧɞɚ ʋ4: FormatException — ȼɯɨɞɧɚɹ ɫɬɪɨɤɚ ɢɦɟɥɚ ɧɟɜɟɪɧɵɣ ɮɨɪɦɚɬ.
    [6]
    Ʉɨɦɚɧɞɚ ʋ2: DivideByZeroException — ɉɨɩɵɬɤɚ ɞɟɥɟɧɢɹ ɧɚ ɧɭɥɶ.
    [7]
    Ʉɨɦɚɧɞɚ ʋ4: FormatException — ȼɯɨɞɧɚɹ ɫɬɪɨɤɚ ɢɦɟɥɚ ɧɟɜɟɪɧɵɣ ɮɨɪɦɚɬ.
    [8]
    Ʉɨɦɚɧɞɚ ʋ1: OverflowException — ɉɟɪɟɩɨɥɧɟɧɢɟ ɜ ɪɟɡɭɥɶɬɚɬɟ ɜɵɩɨɥɧɟɧɢɹ
    ɚɪɢɮɦɟɬɢɱɟɫɤɨɣ ɨɩɟɪɚɰɢɢ.
    [9]
    Ʉɨɦɚɧɞɚ ʋ2: DivideByZeroException — ɉɨɩɵɬɤɚ ɞɟɥɟɧɢɹ ɧɚ Программа, в общем-то, простая. В главном методе командой
    Random rnd=new Random() создается объект rnd класса Random для генерирования случайных чисел. Также мы объявляем переменную nums
    , которая является переменной целочисленного одномерного массива (может ссылаться на одномерный целочисленный массив. Также мы объявляем целочисленные переменные x и n, которые нам нужны для проведения вычислений
    Глава Затем запускается оператор цикла, в котором индексная переменная k последовательно принимает значения от 1 до 9 включительно. Вначале цикла командой Console.Write(
    Ǝ[{0}] Ǝ,k) отображается номер цикла, а переменная n получает начальное (для данного цикла) единичное значение (команда n=1). После этого следует блок с контролируемым кодом. Там есть несколько команд, которые потенциально могут привести к возникновению ошибки (а одна команда просто вызывает ошибку. Перед каждой такой командой (за исключением первой) выполняется команда n++. Это позволяет нам вести учет потенциально опасных команда в случае возникновения ошибки мы будем знать, какая из четырех опасных команд стала фатальной.
    Итак, сначала командой nums=new int[2*rnd.Next(3)-1] выполняется попытка создать массив. Она не всегда успешная. Размер массива определяется выражением 2*rnd.Next(3)-1. Значение выражения rnd.Next(3)
    — это случайное целое число в диапазоне от 0 до 2 включительно (то есть 0, 1 или 2). Поэтому значением выражения 2*rnd.
    Next(3)-1
    с одинаковой вероятностью является число -1, 1 или 3. Если это число -1, то мы пытаемся создать массив отрицательного размера. В этом случае генерируется исключение класса OverflowException. Но если на этом этапе все прошло нормально, то затем выполняется команда x=1/rnd.Next(3). Здесь мы пытаемся присвоить значение целочисленной переменной x. Мы уже знаем, что значение выражения) есть число 0, 1 или 2. Если это число 1 или 2, то выполняется команда деления нацело и переменная x получает значение
    (1 или 0, но это непринципиально. Но если значение выражения окажется равным 0, то при вычислении значения переменной x возникает исключение класса DivideByZeroException, связанное с попыткой деления на ноль. Но если и тут повезло и ошибки не было, то она может возникнуть при выполнении команды nums[rnd.Next(2)-1]=x. Дело в том, что выражение rnd.Next(2)-1 принимает с равной вероятностью значения -1 и 0. Индекс, выходящий за пределы допустимого диапазона (в том числе и отрицательный индекс, — это исключение класса
    IndexOutOfRangeException
    . Если жена этом этапе тоже все в порядке, тона команде nums[0]=Int32.Parse(
    ƎɧɨɥɶƎ) везение точно заканчивается. Здесь предпринята попытка преобразовать в целое число текст ноль, что приводит к исключению класса Таким образом, при выполнении команд цикла точно генерируется исключение одного из четырех упомянутых выше типов. Такое исключение перехватывается и обрабатывается в блоке. В нем отображается
    Обработка исключений
    239
    номер команды, при выполнении которой возникла ошибка (значение переменной n), класс исключения (выражение e.GetType().Name), а также описание возникшей ошибки (выражение Использование нескольких блоков Нас плюкане транклюкировали, пока мы на гастролях были За что Зато, что мы их не успели А вы их за что Чтоб над головой не маячили!
    из к/ф «Кин-дза-дза»
    В предыдущем примере в процессе выполнения программы генерировались исключения разных классов, но перехватывались и обрабатывались они водном блоке. Другими словами, для обработки ошибок разных типов мы использовали один и тот же блок программного кода. Правда мы использовали объект исключения, что позволяло нам определить фактический класс сгенерированного исключения, но принципиально это мало что меняет какая бы ошибка ни возникла, для обработки выполнялся один и тот же код. Но процесс перехвата и обработки исключений можно организовать более гибким способом. Мы можем для каждого типа ошибки предусмотреть персональный блок обработки. Делается это просто. После блока указывается не один, а несколько блоков. В каждом блоке указывается (в круглых скобках) тип ошибки, который обрабатывается этим блоком. При возникновении ошибки в блоке выполнение команд контролируемого кода прекращается и начинается просмотр блоков на предмет того, совпадает ли класс сгенерированного исключения с классом ошибки, указанным в блоке. Если совпадение найдено, соответствующий блок используется для обработки исключения. Если все catch- блоки просмотрены и совпадение не найдено, ошибка остается необработанной НАЗ А МЕТКУ Совпадение класса сгенерированного исключения с классом исключения в блоке понимается в том смысле, что классы должны
    Глава совпадать или класс сгенерированного исключения должен быть производным от класса, указанного в блоке. Другими словами, в блоке обрабатываются исключения, класс которых указан в описании блока, а также исключения всех производных классов. Поэтому, например, блок, в котором типом ошибки указан класс
    Exception
    , указывается последним в последовательности блоков, поскольку такой блок обрабатывает все ошибки.
    В описании блока тип исключения указывается в круглых скобках после ключевого слова catch. При необходимости там же можно обозначить объект исключения и использовать его для получения информации о возникшем событии. В листинге 5.3 представлена программа (которая является вариацией предыдущего примера из листинга 5.2). В ней используется несколько блоков для обработки исключений. Поскольку многие команды в программе должны быть уже знакомы читателю, то для сокращения объема программного кода комментарии удалены.
    
    Листинг 5.3. Использование нескольких блоков System;
    class MoreExceptionsDemo{
    static void Main(){
    Random rnd=new Random();
    int[] nums;
    int x;
    for(int k=1;k<10;k++){
    Console.Write(
    Ǝ[{0}] Ǝ,k);
    try{
    nums=new int[2*rnd.Next(3)-1];
    x=1/rnd.Next(3);
    nums[rnd.Next(2)-1]=x;
    nums[0]=Int32.Parse(
    ƎɧɨɥɶƎ);
    }
    catch(OverflowException){
    Console.WriteLine(
    ƎɈɲɢɛɤɚ ʋ1: ɇɟɜɟɪɧɵɣ ɪɚɡɦɟɪ ɦɚɫɫɢɜɚƎ);
    }
    Обработка исключений catch(DivideByZeroException){
    Console.WriteLine(
    ƎɈɲɢɛɤɚ ʋ2: Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶƎ);
    }
    catch(IndexOutOfRangeException){
    Console.WriteLine(
    ƎɈɲɢɛɤɚ ʋ3: ɇɟɜɟɪɧɵɣ ɢɧɞɟɤɫ ɷɥɟɦɟɧɬɚƎ);
    }
    catch(FormatException){
    Console.WriteLine(
    ƎɈɲɢɛɤɚ ʋ4: ɇɟɜɟɪɧɵɣ ɮɨɪɦɚɬ ɱɢɫɥɚƎ);
    }
    }
    С поправкой на использование генератора случайных чисел результат выполнения программы может быть следующим:
    
    Результат выполнения программы (из листинга 5.3)
    [1]
    Ɉɲɢɛɤɚ ʋ1: ɇɟɜɟɪɧɵɣ ɪɚɡɦɟɪ ɦɚɫɫɢɜɚ
    [2]
    Ɉɲɢɛɤɚ ʋ2: Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶ
    [3]
    Ɉɲɢɛɤɚ ʋ4: ɇɟɜɟɪɧɵɣ ɮɨɪɦɚɬ ɱɢɫɥɚ
    [4]
    Ɉɲɢɛɤɚ ʋ3: ɇɟɜɟɪɧɵɣ ɢɧɞɟɤɫ ɷɥɟɦɟɧɬɚ
    [5]
    Ɉɲɢɛɤɚ ʋ4: ɇɟɜɟɪɧɵɣ ɮɨɪɦɚɬ ɱɢɫɥɚ
    [6]
    Ɉɲɢɛɤɚ ʋ2: Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶ
    [7]
    Ɉɲɢɛɤɚ ʋ2: Ⱦɟɥɟɧɢɟ ɧɚ ɧɨɥɶ
    [8]
    Ɉɲɢɛɤɚ ʋ1: ɇɟɜɟɪɧɵɣ ɪɚɡɦɟɪ ɦɚɫɫɢɜɚ
    [9]
    Ɉɲɢɛɤɚ ʋ3: ɇɟɜɟɪɧɵɣ ɢɧɞɟɤɫ В данном случае мы отказались от переменной n, с помощью которой ранее запоминалась команда, вызывавшая ошибку. Принцип выполнения программного кода такой же, как ив предыдущем случае см. Листинг 5.2). Отличие лишь в том, что при возникновении ошибки (причины возникновения ошибок не изменились) обработка ошибки выполняется одним из четырех блоков. Класс ошибки, обрабатываемой блоком, указан в круглых скобках после ключевого слова
    Глава 5
    242
    catch
    . Объект ошибки при этом мы не объявляли (хотя могли бы, поскольку в процессе обработки ошибок он не используется. В зависимости оттого, какого типа ошибка произошла, для обработки ошибки выполняется код соответствующего блока НАЗ А МЕТКУ Совсем необязательно в индивидуальном порядке обрабатывать все ошибки. Другими словами, мы можем описать блоки только для некоторых типов ошибок и предусмотреть блок для ошибок всех прочих типов. Делается это просто. Например, мы хотим, чтобы по отдельным алгоритмам обрабатывались исключения классов
    OverflowException и
    FormatException
    , а для всех других исключений использовалась одна и та же схема обработки. В таком случае мы используем три блока сначала указываются блоки для ошибок типа
    OverflowException и
    FormatException
    , а затем указывается блок для обработки исключений класса
    Exception
    . При возникновении ошибки блоки проверяются в том порядке, как они указаны. Если исключение не будет передано для обработки нив первый, ни во второй блок, то оно будет обработано третьим блоком, поскольку в нем обрабатываются исключения всех классов, являющихся производными классами от класса Вложенные конструкции try-catch и блок  Вот потому, что выговорите то, что не думаете, и думаете то, что не думаете, вот в клетках и сидите.
    из к/ф «Кин-дза-дза»
    Один блок (внешний) может содержать в себе try-catch конструкции (внутренние. Интерес представляет ситуация, когда ошибка происходит во внутреннем блоке. У этого внутреннего блока есть блоки, предназначенные для обработки исключений. Возможны две ситуации Возникшая во внутреннем блоке ошибка перехватывается и обрабатывается в блоке, связанном сданным блоком Ошибка, возникшая во внутреннем блоке, не перехватывается в блоке, связанном сданным блоком
    Обработка исключений
    243
    В первом случае все происходит штатно: ошибка обрабатывается, и после выполнения соответствующего блока начинают выполняться команды после внутренней try-catch конструкции. А вот во втором случае, когда ошибка не обрабатывается во внутренней try-catch конструкции, в игру вступает внешняя try-catch конструкция. А именно, исключение, сгенерированное во внутреннем блоке, передается для обработки во внешнюю try-catch конструкцию. Если исключение обрабатывается в каком-то из блоков этой конструкции, то дальше выполняются команды после внешней try-catch конструкции. Если ошибка не обрабатывается и во внешнем блоке, то исключение передается дальше, в следующую внешнюю try-catch конструкцию — конечно, если такая имеется. В конце концов, ошибка или будет обработана, или закончатся внешние try-catch конструкции. В последнем случае выполнение программы завершается и появляется сообщение об ошибке.
    Конструкцию try-catch, состоящую из блока и блоков, можно дополнить еще и блоком. Этот блок указывается после блоков. То есть можно использовать конструкцию try-catch- finally такого вида (жирным шрифтом выделены ключевые элементы шаблона //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ
    }
    catch(
    ɤɥɚɫɫ ɨɛɴɟɤɬ){
    //
    Ʉɨɦɚɧɞɵ ɞɥɹ ɨɛɪɚɛɨɬɤɢ ɢɫɤɥɸɱɟɧɢɹ
    }
    finally{
    //
    Ɉɛɹɡɚɬɟɥɶɧɵɟ ɞɥɹ ɜɵɩɨɥɧɟɧɢɹ В этой конструкции блоков может быть несколько. Команды из блока finally выполняются в любом случае — и если ошибка в try- блоке возникла, и если ошибка в блоке не возникла. Возможны три принципиальные ситуации При выполнении кода в блоке ошибка не возникла. Тогда код в блоках игнорируется, а выполняется код в блоке finally
    , и после этого начинается выполнение команд после конструкции try-catch-finally
    Глава 5
    244
    • При выполнении контролируемого кода (в блоке) возникает ошибка, которая обрабатывается водном из блоков. В таком случае после обработки выполняется код в блоке finally
    , а затем выполняются команды после конструкции try-catch-finally
    • Выполняется блоки при этом возникает ошибка. Среди catch
    - блоков нет такого, который был бы предназначен для обработки ошибки данного типа. В таком случае объект исключения передается для обработки во внешнюю конструкцию try-catch
    . Но перед этим выполняются команды в блоке Собственно, ради вот этого третьего сценария обычно и используют блок finally. Небольшой пример, в котором иллюстрируется использование вложенных try-catch конструкций и блока finally, представлен в листинге Листинг 5.4. Вложенные конструкции try-catch и блок finally

    using System;
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class NestedTryDemo{
    //
    ɋɬɚɬɢɱɟɫɤɢɣ ɦɟɬɨɞ:
    static void generator(string num){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɨɨɛɳɟɧɢɹ:
    Console.WriteLine(
    ƎɆɟɬɨɞ ɫ ɚɪɝɭɦɟɧɬɨɦ \Ǝ{0}\Ǝ ɧɚɱɢɧɚɟɬ ɪɚɛɨɬɭƎ,num);
    //
    Ɍɟɤɫɬɨɜɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    string msg=
    ƎɆɚɫɫɢɜ ɧɟ ɫɨɡɞɚɧ!Ǝ;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    //
    ɉɪɟɨɛɪɚɡɨɜɚɧɢɟ ɬɟɤɫɬɚ ɜ ɰɟɥɨɟ ɱɢɫɥɨ:
    int m=Int32.Parse(num);
    //
    ɋɨɡɞɚɧɢɟ ɦɚɫɫɢɜɚ:
    int[] array=new int[m];
    //
    ɇɨɜɨɟ ɡɧɚɱɟɧɢɟ ɬɟɤɫɬɨɜɨɣ ɩɟɪɟɦɟɧɧɨɣ:
    msg=
    Ǝɋɨɡɞɚɧ ɦɚɫɫɢɜ:Ǝ;
    //
    Ɉɩɟɪɚɬɨɪ ɰɢɤɥɚ:
    for(int k=0;k<=4;k++){
    Обработка исключений //
    ɗɥɟɦɟɧɬɭ ɦɚɫɫɢɜɚ ɩɪɢɫɜɚɢɜɚɟɬɫɹ ɡɧɚɱɟɧɢɟ:
    array[k]=12/(4-k);
    //
    Ʉ ɬɟɤɫɬɭ ɞɨɛɚɜɥɹɟɬɫɹ ɡɧɚɱɟɧɢɟ ɷɥɟɦɟɧɬɚ:
    msg+=
    Ǝ Ǝ+array[k];
    }
    }
    //
    Ɉɛɪɚɛɨɬɤɚ ɨɲɢɛɤɢ ɜɵɯɨɞɚ ɡɚ ɩɪɟɞɟɥɵ ɦɚɫɫɢɜɚ:
    catch(IndexOutOfRangeException){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɨɨɛɳɟɧɢɹ:
    Console.WriteLine(
    ƎɈɲɢɛɤɚ ɜ ɦɟɬɨɞɟ: ɜɵɯɨɞ ɡɚ ɩɪɟɞɟɥɵ ɦɚɫɫɢɜɚƎ);
    }
    //
    Ʉɨɞ ɞɥɹ ɨɛɹɡɚɬɟɥɶɧɨɝɨ ɜɵɩɨɥɧɟɧɢɹ:
    finally{
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɹ ɬɟɤɫɬɨɜɨɣ ɩɟɪɟɦɟɧɧɨɣ:
    Console.WriteLine(msg);
    }
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɨɨɛɳɟɧɢɹ:
    Console.WriteLine(
    ƎɆɟɬɨɞ ɡɚɜɟɪɲɢɥ ɪɚɛɨɬɭƎ);
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ɍɟɤɫɬɨɜɵɣ ɦɚɫɫɢɜ:
    string[] args={
    ƎɨɞɢɧƎ,Ǝ-2Ǝ,Ǝ5Ǝ,Ǝ2Ǝ};
    //
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ ɢɡ ɨɞɧɨɝɨ ɷɥɟɦɟɧɬɚ:
    char[] symbs=new char[1];
    //
    Ɉɩɟɪɚɬɨɪ ɰɢɤɥɚ:
    for(int k=0;k //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ (ɜɧɟɲɧɢɣ ɛɥɨɤ):
    try{
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɨɨɛɳɟɧɢɹ:
    Console.WriteLine(
    Ǝȼɵɩɨɥɧɹɟɬɫɹ ɰɢɤɥ ʋ{0}:Ǝ,k+1);
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ (ɜɧɭɬɪɟɧɧɢɣ ɛɥɨɤ):
    Глава 5
    1   ...   15   16   17   18   19   20   21   22   ...   40


    написать администратору сайта