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

  • Результат выполнения программы (из листинга 5.8) Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=Bɉɚɪɚɦɟɬɪ A=5 ɉɚɪɚɦɟɬɪ B=12

  • Результат выполнения программы (из листинга 5.8) Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=Bɉɚɪɚɦɟɬɪ A=0 ɉɚɪɚɦɟɬɪ B=0

  • Результат выполнения программы (из листинга 5.9) ȼɜɟɞɢɬɟ ɬɟɤɫɬ: ɂɡɭɱɚɟɦ ɹɡɵɤ C ȼɜɟɞɢɬɟ ɫɢɦɜɨɥ: ɵ

  • Результат выполнения программы (из листинга 5.9) ȼɜɟɞɢɬɟ ɬɟɤɫɬ: ɂɡɭɱɚɟɦ ɹɡɵɤ C ȼɜɟɞɢɬɟ ɫɢɦɜɨɥ: ɞ

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

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


    Скачать 5.54 Mb.
    НазваниеВасильев А. Н. Программирование
    АнкорВасильев А.Н. Основы программирования на C
    Дата20.09.2022
    Размер5.54 Mb.
    Формат файлаpdf
    Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
    ТипДокументы
    #686596
    страница21 из 40
    1   ...   17   18   19   20   21   22   23   24   ...   40
    Результат выполнения программы (из листинга 5.7)
    ȿɫɬɶ ɨɲɢɛɤɚ: 300
    ɇɟɬ ɨɲɢɛɤɢ: Программа очень простая. В главном методе объявляются три переменные типа byte: переменная a со значением 100, переменная b со значением и переменная c, значение которой при объявлении не при- сваивается.
    Значение переменной c сначала присваивается командой c=checked((byte)(a+b))
    внутри блока. Сумма значений переменных и b равна 300, и это число выходит за верхнюю допустимую границу. Поскольку соответствующее выражение помечено инструкцией, то генерируется исключение класса OverflowException. Оно перехватывается и обрабатывается в блоке. Там выполняется команда Console.WriteLine(
    Ǝȿɫɬɶ ɨɲɢɛɤɚ: Ǝ+(a+b)), и реальная сумма значений переменных a и b появляется в диалоговом окне.
    Еще раз значение переменной c присваивается командой c=unchecked((byte)(a+b))
    . Но теперь мы использовали инструкцию
    Обработка исключений. Поэтому исключение, связанное с выходом за верхнюю границу значения, присваиваемого переменной c , не генерируется НАЗ А МЕТКУ Если бы мы не использовали инструкцию unchecked
    , то исключение тоже не генерировалось бы. Напомним, этот режим используется по умолчанию.
    Фактическое значение переменной c проверяем с помощью команды
    Console.WriteLine(
    Ǝɇɟɬ ɨɲɢɛɤɢ: Ǝ+c).
    q
    ПОДРОБНОСТИ переменной c
    число
    300
    можно представить в виде
    300 = 256 + 44 = 256 + 32 + 8 + 4 = 2 8
    + 2 5
    + 2 3
    + 2 2
    . Но для записи значений типа byte отводится всего 8 битов. В присваиваемом значении старшие биты отбрасываются (то есть пропадает слагаемое 2 8
    ). Переменная c
    получает значение 2 5
    + 2 3
    + 2 2
    = 32 + 8 + 4 = Использование исключений

    У нас в уезде писарь был. Год рождения в пач- порте одной циферкой записывал — чернила, шельмец, вишь, экономил.
    из к/ф Формула любви»
    В этом разделе мы рассмотрим несколько примеров, в которых используется обработка исключительных ситуаций. Начнем с программы, в которой решается линейное уравнение вида
    Ax = B. В общем случае решением этого уравнения является значение
    x = B/A. Но эта формула справедлива, только если параметр
    A ≠ 0. А если A = 0, то возможны два варианта. При
    B ≠ 0 уравнение решений не имеет, а при B = 0 решением является любое число. Соответствующий программный код представлен в листинге Листинг 5.8. Решение линейного уравнения System;
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    Глава 5
    260
    class EquationDemo{
    //
    Ɇɟɬɨɞ ɞɥɹ ɪɟɲɟɧɢɹ ɭɪɚɜɧɟɧɢɹ:
    static double solve(double A,double B){
    //
    ȿɫɥɢ ɡɧɚɱɟɧɢɟ ɩɚɪɚɦɟɬɪɚ A ɨɬɥɢɱɧɨ ɨɬ ɧɭɥɹ:
    if(A!=0) return B/A;
    //
    Ɍɟɤɫɬɨɜɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    string msg;
    //
    ȿɫɥɢ ɩɚɪɚɦɟɬɪ B ɢɦɟɟɬ ɧɭɥɟɜɨɟ ɡɧɚɱɟɧɢɟ:
    if(B==0) msg=
    ƎɊɟɲɟɧɢɟ - ɥɸɛɨɟ ɱɢɫɥɨƎ;
    //
    ȿɫɥɢ ɡɧɚɱɟɧɢɟ ɩɚɪɚɦɟɬɪɚ B ɨɬɥɢɱɧɨ ɨɬ ɧɭɥɹ:
    else msg=
    ƎɊɟɲɟɧɢɣ ɧɟɬƎ;
    //
    Ƚɟɧɟɪɢɪɭɟɬɫɹ ɢɫɤɥɸɱɟɧɢɟ:
    throw new ArithmeticException(msg);
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɑɢɫɥɨɜɵɟ ɩɟɪɟɦɟɧɧɵɟ:
    double A,B,x;
    Console.WriteLine(
    ƎɊɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=BƎ);
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    Console.Write(
    Ǝɉɚɪɚɦɟɬɪ A=Ǝ);
    //
    ɋɱɢɬɵɜɚɟɬɫɹ ɡɧɚɱɟɧɢɟ ɩɚɪɚɦɟɬɪɚ A:
    A=Double.Parse(Console.ReadLine());
    Console.Write(
    Ǝɉɚɪɚɦɟɬɪ B=Ǝ);
    //
    ɋɱɢɬɵɜɚɟɬɫɹ ɡɧɚɱɟɧɢɟ ɩɚɪɚɦɟɬɪɚ B:
    B=Double.Parse(Console.ReadLine());
    //
    ȼɵɱɢɫɥɟɧɢɟ ɪɟɲɟɧɢɹ:
    x=solve(A,B);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɪɟɲɟɧɢɹ:
    Console.WriteLine(
    ƎɊɟɲɟɧɢɟ x={0}Ǝ,x);
    }
    Обработка исключений //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɹ:
    catch(Exception e){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɨɩɢɫɚɧɢɹ ɢɫɤɥɸɱɟɧɢɹ:
    Console.WriteLine(e.Message);
    }
    Результат выполнения программы может быть таким (здесь и далее жирным шрифтом выделены введенные пользователем значения):
    
    Результат выполнения программы (из листинга 5.8)
    Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=B
    ɉɚɪɚɦɟɬɪ A=5
    ɉɚɪɚɦɟɬɪ B=12
    Ɋɟɲɟɧɢɟ x=2,4
    Таким:
    
    Результат выполнения программы (из листинга 5.8)
    Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=B
    ɉɚɪɚɦɟɬɪ A=0
    ɉɚɪɚɦɟɬɪ B=12
    Ɋɟɲɟɧɢɣ ɧɟɬ
    Таким:
    
    Результат выполнения программы (из листинга 5.8)
    Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=B
    ɉɚɪɚɦɟɬɪ A=0
    ɉɚɪɚɦɟɬɪ B=0
    Ɋɟɲɟɧɢɟ — ɥɸɛɨɟ ɱɢɫɥɨ
    Глава Или таким:
    
    Результат выполнения программы (из листинга 5.8)
    Ɋɟɲɟɧɢɟ ɭɪɚɜɧɟɧɢɹ Ax=B
    ɉɚɪɚɦɟɬɪ A=5
    ɉɚɪɚɦɟɬɪ B=b
    ȼɯɨɞɧɚɹ ɫɬɪɨɤɚ ɢɦɟɥɚ ɧɟɜɟɪɧɵɣ Для решения уравнения мы описали специальный статический метод solve()
    . У метода два аргумента типа double. Это параметры A и B уравнения. Результатом метод возвращает частное A/B. Но такое значение вычисляется только в случае, если первый аргумент A отличен от нуля. Если первый аргумент нулевой, то проверяется (на предмет равенства нулю) значение второго аргумента B. В зависимости от результатов проверки, текстовой переменной msg присваивается значение, и эта переменная передается в качестве аргумента конструктору класса при генерировании исключения. Таким образом, метод solve() результатом возвращает решение уравнения или метод генерирует исключение класса ArithmeticException, если решений нет или если решением может быть любое число. Эта информация содержится в описании исключения (свойство Message объекта ис- ключения).
    В главном методе программы сначала считываются значения параметров и B, а затем для вычисления решения уравнения вызывается метод. Все эти команды выполняются внутри блока, а соответствующий блок перехватывает все исключения, в том числе и связанные с некорректно введенными значениями НАЗ А МЕТКУ Если деление на ноль выполняется на множестве действительных чисел, то исключение не генерируется (в отличие от случая, когда деление на ноль выполняется на множестве целых чисел).
    В следующем примере есть методу которого два аргумента текст и символ. Результатом метод возвращает индекс первого вхождения символа в текст. Если заданного символа в тексте нетто метод генерирует исключение. Рассмотрим программный код в листинге 5.9.
    Обработка исключений
    263
    
    Листинг 5.9. Поиск символа в тексте System;
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class FindSymbolDemo{
    //
    Ɇɟɬɨɞ ɞɥɹ ɩɨɢɫɤɚ ɫɢɦɜɨɥɚ ɜ ɬɟɤɫɬɟ:
    static int find(string txt,char s){
    //
    ɉɟɪɟɛɨɪ ɫɢɦɜɨɥɨɜ ɜ ɬɟɤɫɬɟ:
    for(int k=0;k //
    ȿɫɥɢ ɟɫɬɶ ɫɨɜɩɚɞɟɧɢɟ:
    if(txt[k]==s) return k;
    }
    //
    Ƚɟɧɟɪɢɪɭɟɬɫɹ ɢɫɤɥɸɱɟɧɢɟ:
    throw new Exception(
    Ǝɋɢɦɜɨɥɚ \ƍƎ+s+Ǝ\ƍ ɜ ɬɟɤɫɬɟ \ƎƎ+txt+Ǝ\Ǝ ɧɟɬƎ);
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ɍɟɤɫɬɨɜɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    string txt;
    //
    ɋɢɦɜɨɥɶɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    char s;
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int index;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    Console.Write(
    Ǝȼɜɟɞɢɬɟ ɬɟɤɫɬ: Ǝ);
    //
    ɋɱɢɬɵɜɚɧɢɟ ɬɟɤɫɬɚ:
    txt=Console.ReadLine();
    Console.Write(
    Ǝȼɜɟɞɢɬɟ ɫɢɦɜɨɥ: Ǝ);
    //
    ɋɱɢɬɵɜɚɧɢɟ ɫɢɦɜɨɥɚ:
    s=(char)Console.Read();
    //
    Ɉɩɪɟɞɟɥɟɧɢɟ ɢɧɞɟɤɫɚ ɫɢɦɜɨɥɚ ɜ ɬɟɤɫɬɟ:
    Глава 5
    264
    index=find(txt,s);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɪɟɡɭɥɶɬɚɬɚ:
    Console.WriteLine(
    Ǝɂɧɞɟɤɫ ɫɢɦɜɨɥɚ: Ǝ+index);
    }
    //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(Exception e){
    //
    Ɉɩɢɫɚɧɢɟ ɢɫɤɥɸɱɟɧɢɹ:
    Console.WriteLine(e.Message);
    }
    Возможный результат выполнения программы представлен ниже (жирным шрифтом выделены введенные пользователем значения):
    
    Результат выполнения программы (из листинга 5.9)
    ȼɜɟɞɢɬɟ ɬɟɤɫɬ: ɂɡɭɱɚɟɦ ɹɡɵɤ C#
    ȼɜɟɞɢɬɟ ɫɢɦɜɨɥ: ɵ
    ɂɧɞɟɤɫ ɫɢɦɜɨɥɚ: Если символа в тексте нетто результат будет следующим:
    
    Результат выполнения программы (из листинга 5.9)
    ȼɜɟɞɢɬɟ ɬɟɤɫɬ: ɂɡɭɱɚɟɦ ɹɡɵɤ C#
    ȼɜɟɞɢɬɟ ɫɢɦɜɨɥ: ɞ
    ɋɢɦɜɨɥɚ 'ɞ' ɜ ɬɟɤɫɬɟ Ǝɂɡɭɱɚɟɦ ɹɡɵɤ C#Ǝ Схему мы использовали простую, напоминающую подход, реализованный в предыдущем примере (см. Листинг 5.8). В статическом методе find()
    перебираются символы в тексте (первый аргумент, и если символ из текста совпадает стем символом, который передан вторым аргументом методу, то индекс символа возвращается результатом метода. Если оператор цикла завершился, а результат не возвращен, то генерируется исключение класса Exception. Описание исключения содержит информацию о том, что данного символа в тексте нет
    Обработка исключений
    265
    В главном методе считывается текст и символ. Затем вызывается метод find()
    . Команды размещены в блоке, а исключения обрабатываются в блоке ПОДРОБНОСТИ bДля считывания символа использован статический метод из класса
    Console
    . Метод возвращает код считанного символа. Поэтому мы воспользовались явным приведением типа для преобразования кода в символ.
    В следующем примере обработка исключений используется для прекращения работы оператора цикла. Рассмотрим программу в листинге Листинг 5.10. Завершение работы оператора цикла System;
    //
    Ʉɥɚɫɫ ɫ ɢɧɞɟɤɫɚɬɨɪɨɦ:
    class MyClass{
    //
    Ɂɚɤɪɵɬɨɟ ɩɨɥɟ - ɫɫɵɥɤɚ ɧɚ ɦɚɫɫɢɜ:
    private int[] nums;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ:
    public MyClass(int size){
    nums=new int[size];
    }
    //
    ɂɧɞɟɤɫɚɬɨɪ:
    public int this[int k]{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    return nums[k];
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    set{
    nums[k]=value;
    }
    }
    Глава 5
    266
    }
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class WhileAndExceptionDemo{
    //
    Ɇɟɬɨɞ ɞɥɹ ɨɬɨɛɪɚɠɟɧɢɹ ɡɧɚɱɟɧɢɣ ɷɥɟɦɟɧɬɨɜ
    //
    ɦɚɫɫɢɜɚ ɢɡ ɨɛɴɟɤɬɚ:
    static void show(MyClass obj){
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int k=0;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɛɥɨɤ:
    try{
    //
    Ɉɩɟɪɚɬɨɪ ɰɢɤɥɚ:
    while(true){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɹ ɷɥɟɦɟɧɬɚ ɦɚɫɫɢɜɚ:
    Console.Write(
    Ǝ|Ǝ+obj[k]);
    //
    ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɢɧɞɟɤɫɧɨɣ ɩɟɪɟɦɟɧɧɨɣ:
    k++;
    }
    }
    //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(IndexOutOfRangeException){
    Console.WriteLine(
    Ǝ|Ǝ);
    }
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ ɤɥɚɫɫɚ:
    MyClass obj=new MyClass(10);
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int k=0;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    //
    Ɉɩɟɪɚɬɨɪ ɰɢɤɥɚ:
    Обработка исключений do{
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɷɥɟɦɟɧɬɭ ɦɚɫɫɢɜɚ
    //
    ɜ ɨɛɴɟɤɬɟ:
    obj[k]=2*k+1;
    //
    ɍɜɟɥɢɱɟɧɢɟ ɡɧɚɱɟɧɢɹ ɢɧɞɟɤɫɧɨɣ ɩɟɪɟɦɟɧɧɨɣ:
    k++;
    }while(true);
    }
    //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(IndexOutOfRangeException){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɨɞɟɪɠɢɦɨɝɨ ɦɚɫɫɢɜɚ ɢɡ ɨɛɴɟɤɬɚ:
    show(obj);
    }
    Результат выполнения программы такой:
    
    Результат выполнения программы (из листинга В этом примере мы описали класс MyClass, в котором есть закрытое поле nums, являющееся ссылкой на целочисленный массив. Массив создается при вызове конструктора. Аргументом конструктору передается число, определяющее размер массива. Для доступа к элементам массива используется индексатор. Проблема в том, что массив закрытый, нов классе не определены свойство или метод, которые позволили бы узнать размер массива.
    В главном классе описан статический метод show(), который не возвращает результат. Аргументом методу передается объект класса
    MyClass
    . Метод предназначен для отображения содержимого массива из объекта, переданного методу в качестве аргумента. Для этого в блоке запускается формально бесконечный оператор цикла while
    . За каждую итерацию цикла отображается значение проиндексированного объекта (значение элемента массива из объекта, и индекс
    Глава увеличивается на единицу. Как только будет предпринята попытка считать значение несуществующего элемента, будет сгенерировано исключение класса IndexOutOfRangeException. Как следствие, выполнение оператора цикла прекращается, а исключение обрабатывается в catch-блоке.
    В главном методе командой MyClass obj=new MyClass(10) создается объект obj класса MyClass, в котором спрятан массив из 10 элементов. Для заполнения массива в блоке запускается бесконечный цикл с оператором do-while. Командой obj[k]=2*k+1 очередному элементу массива присваивается значение (нечетное число, а затем командой k++ увеличивается значение индекса. Оператор цикла завершает выполнение при возникновении исключения класса
    IndexOutOfRangeException
    (попытка присвоить значение несуществующему элементу. При обработке этого исключения в блоке с помощью команды show(obj) отображается содержимое массива из объекта obj (последовательность из 10 нечетных чисел).
    В следующем примере описывается пользовательский класс исключения, который позволяет создавать объекты на основе уже существующих объектов исключений. Также в программе используется повторное генерирование исключений (имеется ввиду генерирование исключения в блоке. Соответствующая программа представлена в листинге Листинг 5.11. Пользовательский класс на основе объекта System;
    //
    Ʉɥɚɫɫ ɢɫɤɥɸɱɟɧɢɹ:
    class MyException:Exception{
    //
    Ɂɚɤɪɵɬɵɟ ɬɟɤɫɬɨɜɵɟ ɩɨɥɹ:
    private string time;
    private string source;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ ɫɨɡɞɚɧɢɹ ɨɛɴɟɤɬɚ ɢɫɤɥɸɱɟɧɢɹ:
    public MyException(Exception obj):base(
    ƎɈɲɢɛɤɚ ɤɥɚɫɫɚ MyExceptionƎ){
    //
    Ʉɥɚɫɫ ɢɫɯɨɞɧɨɣ ɨɲɢɛɤɢ:
    source=obj.GetType().Name;
    //
    Ⱦɚɬɚ ɢ ɜɪɟɦɹ ɝɟɧɟɪɢɪɨɜɚɧɢɹ ɨɲɢɛɤɢ:
    Обработка исключений time=DateTime.Now.ToString();
    }
    //
    ɉɟɪɟɨɩɪɟɞɟɥɟɧɢɟ ɦɟɬɨɞɚ ToString():
    public override string ToString(){
    string txt=Message+
    Ǝ\nƎ;
    txt+=
    Ǝɂɫɯɨɞɧɵɣ ɤɥɚɫɫ ɨɲɢɛɤɢ: Ǝ+source+Ǝ\nƎ;
    txt+=
    ƎȾɚɬɚ ɢ ɜɪɟɦɹ ɝɟɧɟɪɢɪɨɜɚɧɢɹ: Ǝ+time;
    return txt;
    }
    }
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class MoreMyExceptionDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ȼɧɟɲɧɢɣ try-ɛɥɨɤ:
    try{
    //
    ȼɧɭɬɪɟɧɧɢɣ try-ɛɥɨɤ:
    try{
    //
    Ɇɚɫɫɢɜ ɢɡ ɨɞɧɨɝɨ ɷɥɟɦɟɧɬɚ:
    int[] a={1};
    //
    Ɉɛɪɚɳɟɧɢɟ ɤ ɧɟɫɭɳɟɫɬɜɭɸɳɟɦɭ ɷɥɟɦɟɧɬɭ
    //
    ɦɚɫɫɢɜɚ (ɝɟɧɟɪɢɪɨɜɚɧɢɟ ɨɲɢɛɤɢ):
    a[1]=2;
    }
    //
    ȼɧɭɬɪɟɧɧɢɣ catch-ɛɥɨɤ:
    catch(Exception e){
    //
    ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ ɢɫɤɥɸɱɟɧɢɹ:
    MyException me=new MyException(e);
    //
    Ƚɟɧɟɪɢɪɨɜɚɧɢɟ ɢɫɤɥɸɱɟɧɢɹ:
    throw me;
    }
    }
    Глава 5
    270
    //
    ȼɧɟɲɧɢɣ catch-ɛɥɨɤ:
    catch(Exception e){
    Console.WriteLine(e);
    }
    Результат выполнения программы следующий:
    
    Результат выполнения программы (из листинга 5.11)
    Ɉɲɢɛɤɚ ɤɥɚɫɫɚ MyException
    ɂɫɯɨɞɧɵɣ ɤɥɚɫɫ ɨɲɢɛɤɢ: IndexOutOfRangeException
    Ⱦɚɬɚ ɢ ɜɪɟɦɹ ɝɟɧɟɪɢɪɨɜɚɧɢɹ: 19.09.2017 Интерес представляет класс MyException. Класс имеет два закрытых текстовых поля source и time. Также в классе описан конструктор, который позволяет создавать объекты класса MyException на основе объектов класса Exception (а значит, и на основе объектов всех производных классов от класса Exception). Конструктору производного класса передается текст
    ƎɈɲɢɛɤɚ ɤɥɚɫɫɚ MyExceptionƎ, который определяет значение свойства Message создаваемого объекта. Полю source присваивается значение obj.GetType().Name. Это название класса для объекта исключения. На основе этого класса создается новый объект исключения. Полю time в качестве значения присваивается выражение. Здесь мы использовали структуру из пространства имен System. С помощью статического свойства Now получаем ссылку на экземпляр структуры DateTime, содержащий информацию о текущей дате и времени (определяется по системным часам компьютера. С помощью метода ToString(), который вызывается из этого экземпляра, получаем текстовую строку с датой и временем. Именно эта текстовая строка становится значением поля Метод ToString() переопределен так, что результатом возвращается текст, содержащий значение свойства Message объекта исключения, а также значения полей source и time (с дополнительными текстовыми пояснениями
    Обработка исключений
    271
    В главном классе мы используем вложенные конструкции try- catch
    . Во внутреннем блоке командой int[] a={1} создается массив из одного элемента. После этого размещена команда a[1]=2, при выполнении которой происходит ошибка (обращение к несуществующему элементу массива. Эта ошибка перехватывается и обрабатывается во внутреннем блоке. Обработка состоит в том, что командой MyException me=new MyException(e) создается объект me класса MyException. Объект создается на основе объекта исключения, переданного для обработки. После этого командой throw me искусственно генерируется исключение пользовательского класса. Это исключение перехватывается во внешнем блоке. Там объект исключения передается аргументом методу WriteLine(), в результате чего для объекта вызывается метод ToString(), и полученное текстовое значение отображается в консольном окне. Хочется верить, что содержимое сообщения комментариев не требует.
    Следующая программа содержит классу которого есть целочисленное (тип int) свойство number. Но значение этого свойства сохраняется в закрытом поле типа byte. С помощью инструкции checked и обработки исключений свойство реализовано таким образом, что при попытке присвоить свойству значение, выходящее за допустимые границы для типа byte, свойству присваивается значение 255. Интересующий нас код представлен в листинге Листинг 5.12. Обработка исключений в свойстве System;
    //
    Ʉɥɚɫɫ ɫɨ ɫɜɨɣɫɬɜɨɦ:
    class MyClass{
    //
    Ɂɚɤɪɵɬɨɟ ɩɨɥɟ ɬɢɩɚ byte:
    private byte num;
    //
    Ɉɬɤɪɵɬɨɟ ɫɜɨɣɫɬɜɨ ɬɢɩɚ int:
    public int number{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    get{
    //
    Ɂɧɚɱɟɧɢɟ ɫɜɨɣɫɬɜɚ:
    return num;
    Глава 5
    272
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    set{
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    //
    Ƚɟɧɟɪɢɪɨɜɚɧɢɟ ɢɫɤɥɸɱɟɧɢɹ ɩɪɢ ɩɟɪɟɩɨɥɧɟɧɢɢ:
    checked{
    //
    Ɂɧɚɱɟɧɢɟ ɩɨɥɹ:
    num=(byte)value;
    }
    }
    //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(OverflowException){
    //
    Ɂɧɚɱɟɧɢɟ ɩɨɥɹ:
    num=255;
    }
    }
    }
    }
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class CheckedDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ɉɛɴɟɤɬ ɤɥɚɫɫɚ:
    MyClass obj=new MyClass();
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    obj.number=100;
    //
    ɉɪɨɜɟɪɤɚ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    Console.WriteLine(
    ƎɁɧɚɱɟɧɢɟ ɫɜɨɣɫɬɜɚ: Ǝ+obj.number);
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    obj.number=300;
    //
    ɉɪɨɜɟɪɤɚ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    Обработка исключений Console.WriteLine(
    ƎɁɧɚɱɟɧɢɟ ɫɜɨɣɫɬɜɚ: Ǝ+obj.number);
    Результат выполнения программы такой:
    
    1   ...   17   18   19   20   21   22   23   24   ...   40


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