Перестарался с исключениями

82
22 августа 2021, 04:50

Всё работало, а теперь перестало, как добавил try...catch блоки. За говнокод ругаться не надо пожалуйста, ещё учусь. Класс от которого наследуется не закидывал, т.к. не имеет смысла. Он абстрактный с одним методом.

Весь проект на GitHub (Класс Rectangle был идентичным с классом Circle, но что-то пошло не так. Rectangle полностью рабочий, есть догадка что сломалось из-за того, что не правильно добавил исключения цветам и всё пошло не туда.)

Суть проблемы : После задачи в конструкторе значений и после вызова метода tostring() выводит нулевые значения для площади и для цвета.

Класс когда всё работало без проблем

class Circle : Figure
{
    public byte R { get; }
    public byte G { get; }
    public byte B { get; }
    double area;
    public double Radius { get; set; }

    public Circle(double radius, byte r, byte g, byte b)
    {
        Console.Write("\nУкажите радиус круга: ");
        radius = Convert.ToDouble(Console.ReadLine());
        if (radius < 0)
        {
            Console.WriteLine("Радиус должен быть не отрицательным.");
            while (true)
            {
                Console.Write("Укажите радиус: ");
                radius = Convert.ToDouble(Console.ReadLine());
                if (radius < 0)
                    Console.WriteLine("Вы опять ввели отрицательное значение.);
                if (radius > 0)
                    break;
            }
        }
        Console.WriteLine("Чтобы фигурка была красивой укажи цвет для неё");
        Console.Write("Enter 1st RGB id color: ");
        r = Convert.ToByte(Console.ReadLine());
        Console.Write("Enter 2nd RGB id color: ");
        g = Convert.ToByte(Console.ReadLine());
        Console.Write("Enter 3rd RGB id color: ");
        b = Convert.ToByte(Console.ReadLine());
        R = r;
        G = g;
        B = b;
        Radius = radius;
    }
    public override double Aria()
    {
        return area = Math.PI * Math.Pow(Radius, 2);
    }
    public override string ToString()
    {
        if (R == 255 && B == 0 && G == 0)
        {
            return "\nPure Red \n";
        }
        if (R == 0 && B == 255 && G == 0)
        {
            return "\nPure Blue \n";
        }
        if (R == 0 && B == 0 && G == 255)
        {
            return "\nPure Green \n";
        }
        return $"\n{Math.Round(area,3)} см^2 - площадь круга \nR:{R} G:{G} B:{B} - цвет фигуры";
    }

Класс когда я сломал что-то и всё пошло не так. (Всегда выводит нулевые значения)

class Circle : Figure
{
    int exception;
    public byte R { get; }
    public byte G { get; }
    public byte B { get; }
    double area;
    public double Radius { get; set; }

    public Circle(double radius, byte r, byte g, byte b)
    {
        for (int i = 0; i == exception; i++)
        {
            try
            {
                Console.Write("\nУкажите радиус круга: ");
                radius = Convert.ToDouble((Console.ReadLine()));
            }
            catch (FormatException ex)
            {
                Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                exception++;
            }
        }
        exception = 0;
        if (radius < 0)
        {
            Console.WriteLine("Радиус должен быть не отрицательным.");
            while (true)
            {
                for (int i = 0; i == exception; i++)
                {
                    try
                    {
                        Console.Write("Укажите радиус круга: ");
                        radius = Convert.ToDouble((Console.ReadLine()));
                    }
                    catch (FormatException ex)
                    {
                        Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                        exception++;
                    }
                }
                if (radius < 0)
                    Console.WriteLine("Вы опять ввели отрицательное значение.");
                if (radius > 0)
                    break;
            }
        }
        Console.WriteLine("Укажите цвет для фигуры в формате RGB: ");
        for (int i = 0; i == exception; i++)
        {
            try
            {
                Console.Write("Enter 1st RGB id color: ");
                r = Convert.ToByte(Console.ReadLine());
            }
            catch (FormatException ex)
            {
                Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                exception++;
            }
            catch (OverflowException ex)
            {
                Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                exception++;
            }
        }
        exception = 0;

        if (r < 0)
        {
            Console.WriteLine("Введено отрицательное значение");
            while (true)
            {
                for (int i = 0; i == exception; i++)
                {
                    try
                    {
                        Console.Write("Enter 1st RGB id color: ");
                        r = Convert.ToByte(Console.ReadLine());
                    }
                    catch (FormatException ex)
                    {
                        Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                        exception++;
                    }
                    catch (OverflowException ex)
                    {
                        Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                        exception++;
                    }
                }
                exception = 0;
                if (r < 0)
                    Console.WriteLine("Вы опять ввели отрицательное значение.");
                if (r > 0)
                    break;
            }
        }

        for (int i = 0; i == exception; i++)
        {
            try
            {
                Console.Write("Enter 2nd RGB id color: ");
                g = Convert.ToByte(Console.ReadLine());
            }
            catch (FormatException ex)
            {
                Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                exception++;
            }
            catch (OverflowException ex)
            {
                Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                exception++;
            }
        }
        exception = 0;
        if (g < 0)
        {
            Console.WriteLine("Введено отрицательное значение");
            while (true)
            {
                for (int i = 0; i == exception; i++)
                {
                    try
                    {
                        Console.Write("Enter 2nd RGB id color: ");
                        g = Convert.ToByte(Console.ReadLine());
                    }
                    catch (FormatException ex)
                    {
                        Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                        exception++;
                    }
                    catch (OverflowException ex)
                    {
                        Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                        exception++;
                    }
                }
                exception = 0;
                if (g < 0)
                    Console.WriteLine("Вы опять ввели отрицательное значение.");
                if (g > 0)
                    break;
            }
        }
            for (int i = 0; i == exception; i++)
            {
                try
                {
                    Console.Write("Enter 3rd RGB id color: ");
                    b = Convert.ToByte(Console.ReadLine());
                }
                catch (FormatException ex)
                {
                    Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                    exception++;
                }
                catch (OverflowException ex)
                {
                    Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                    exception++;
                }
            }
            exception = 0;
            if (b < 0)
            {
                Console.WriteLine("Введено отрицательное значение");
                while (true)
                {
                    for (int i = 0; i == exception; i++)
                    {
                        try
                        {
                            Console.Write("Enter 2nd RGB id color: ");
                            b = Convert.ToByte(Console.ReadLine());
                        }
                        catch (FormatException ex)
                        {
                            Console.WriteLine($"{ex.Message} Нужно вводить число. ");
                            exception++;
                        }
                        catch (OverflowException ex)
                        {
                            Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
                            exception++;
                        }
                    }
                    exception = 0;
                    if (b < 0)
                        Console.WriteLine("Вы опять ввели отрицательное значение.");
                    if (b > 0)
                        break;
                }
                R = r;
                G = g;
                B = b;
                Radius = radius;
            }
    }
    public override double Aria()
    {
        return area = Math.PI * Math.Pow(Radius, 2);
    }
    public override string ToString()
    {
        if (R == 255 && B == 0 && G == 0)
        {
            return "\nPure Red \n";
        }
        if (R == 0 && B == 255 && G == 0)
        {
            return "\nPure Blue \n";
        }
        if (R == 0 && B == 0 && G == 255)
        {
            return "\nPure Green \n";
        }
        return $"\n{Math.Round(area,2)} см^2 - площадь круга \nR:{R} G:{G} B:{B} - цвет фигуры";
    }
}
Answer 1

У вас проблема в том, что код

R = r;
G = g;
B = b;
Radius = radius;

недоступен, перенесите его после фигурной скобки и все должно сработать.

Answer 2

В вашем случае для того, чтобы заставить пользователя ввести правильное число, проще всего использовать TryParse (в примере указан тип byte, для переменной double используйте double):

byte x;
while (!byte.TryParse (Console.ReadLine (), out x)) {
    Console.WriteLine ("Введите число от 0 до 255 включительно.");
}

Можно добавить дополнительные проверки, если хотите:

byte x;
while (!byte.TryParse (Console.ReadLine (), out x) || x == 9) {
    Console.WriteLine ("Введите число от 0 до 255 включительно, и не 9.");
}

Если вы хотите ловить разные исключения и показывать разные сообщения, можно сделать и более громоздкую проверку:

byte x;
while (true) {
    try {
        x = byte.Parse (Console.ReadLine ());
        // можно добавить сюда свои условия, как в примере с девяткой
        if (x == 9) Console.WriteLine ("Мне не нравится число 9.");
        else        break;
    }
    catch (FormatException e) {
        Console.WriteLine ("Введенная строка не была числом.");
    }
    catch (OverflowException e) {
        Console.WriteLine ("Введенное число не находилось вне диапазона [0, 255].");
    }
}

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

READ ALSO
Отслеживание вызова функций C#

Отслеживание вызова функций C#

При вызове функций необходимо выполнять запись в базу действияФункции все разнородные, т

81
Подключение к базе Oracle через C#

Подключение к базе Oracle через C#

Совсем еще новичокДелаю программу по туториалу

99
PowerShell не может найти сборку

PowerShell не может найти сборку

У меня есть скрипт который читает файл и запускает его

220