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ść?