Exception Handling Abuse

0

Cześć,

Napisałem prosty program:

using System;

public class IntroductionIntoCSharp12
{
    public static void Main()
    {
        try
        {
            int FN, SN;
            Console.WriteLine("Podaj pierwszą liczbę");
            FN = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Podaj drugą liczbę");
            SN = Convert.ToInt32(Console.ReadLine());

            int result = FN / SN;

            Console.WriteLine("Wynik dzielenia: " + result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Wprowadzą wartość niezerową");
        }
        catch (OverflowException)
        {
            Console.WriteLine("Wartości muszą przyjmować pomiędzy {0} i {1}", Int32.MinValue, Int32.MaxValue);
        }
        catch (FormatException)
        {
            Console.WriteLine("Wprowadzą poprawną wartość");
        }
        catch (Exception)
        {
            Console.WriteLine("INNY BŁĄD!");
        }

        Console.ReadKey();
    }
}

I znalazłem w internecie taki temat:
https://dotnettutorials.net/lesson/exception-handling-abuse-csharp/
Dla tego trochę przerobiłem kod na taki:

using System;
namespace IntroductionIntroCsharp12a
{
    class Program
    {
        static void Main()
        {
            int FN, SN, result;

        FirstStage:
            Console.WriteLine("Podaj pierwszą wartość");
            try
            {
                if (Int32.TryParse(Console.ReadLine(), out FN))
                {
                SecondStage:
                    Console.WriteLine("Podaj drugą wartość");
                    if (Int32.TryParse(Console.ReadLine(), out SN))
                    {
                        if (SN != 0)
                        {
                            result = FN / SN;
                        }
                        else
                        {
                            Console.WriteLine("Druga wartość nie może być wartością zerową");
                            goto SecondStage;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Niepoprawna druga wartość");
                        goto SecondStage;
                    }
                }
                else
                {
                    Console.WriteLine("Niepoprawna pierwsza wartość");
                    goto FirstStage;
                }
                Console.WriteLine("Wynik dzielenia to: " + result);
            }
            catch (Exception)
            {
                Console.WriteLine("Jakiś błąd!");
            }
            Console.ReadKey();
        }
    }
}

Generalnie nic ciekawego, taka podstawa programowania, ale tutaj pojawia się moje pytanie.

Jaka jest wyższą drugiej wersji programu nad pierwszą? Czemu staramy się nadużywać korzystania z wyjątków? Są one kosztowne obliczeniowo? Mógłby ktoś rozwinąć zdanie "we are using exception handling mechanisms to implement programming logic which is bad" napisane przez autora postu z tego blogu? Czemu jest to samo w sobie złe?

Co do samego programu, to pierwsze jest chyba prostszy, mniej skompilowany. Drugi natomiast posiada dużo zagnieżdżeń.

Mam też inne pytanie. Czy korzystanie z "go to" jest dobrą praktyką programistyczną czy lepiej wrzucić to do nieskończonej pętli "while" i po prostu za pomocą "break" z niej wyjść?

2

Nie, "goto" nie jest dobrą praktyką. Wręcz przeciwnie - wskazuje na poważne problemy z kodem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1