Wyjątek z przekroczeniem zakresu

0

Piszę aplikacje na windows phone'a, taki kalkulator z funkcjami np. silnią. Wszystko jest okej dopóki nie przekroczę zakresu long'a, bo wtedy wyniki to liczba ujemna bądź zero. Chciałbym sprawić by program przychwytywał wyjątek i wyświetlał w textboxie komunikat o błędzie. Mniej więcej tak:

try
{
  //Liczenie silni;
}
Catch(exception)
{
  Throw new exception outofrange;
}

Chciałbyś uzyskać coś takiego, niestety nie potrafię znaleźć odpowiedniego wyjątku i odpowiednio zapisać catch'a.

Z góry dziękuję za każdy rodzaj pomocy.

0

"Wszystko jest okej dopóki nie przekroczę zakresu long'a, bo wtedy wyniki to liczba ujemna bądź zero."
Nieprawda, dla n > 20 (i 8 bajtowej zmiennej) wynik jest błędny, ale niekoniecznie ujemny.

23! = 8128291617894825984
25! = 7034535277573963776

Zamiast łapać wyjątek, sprawdzaj czy argument nie jest za duży.

0

Na początku tak miałem, że w przypadku gdy liczba do policzenia silni jest większa niż 20 to zwraca komunikat błędu:"liczba za duża", ale prowadzący laboratoria powiedział, że chce bym użył exception od przekraczania zakresu do tego zadania.

0

To rzucaj ArgumentOutOfRangeException gdy argument funkcji silnia jest spoza przedziału [0;20]. Rozwiązanie raczej durne, ale jak prowadzący się uparł..

0

Chyba po prostu nie rozumiem do końca "ArgumentOutOfRangeException". Napisałem taki kod:

 catch(ArgumentOutOfRangeException ex)
            {
                textbox_Okno.Text = "Błąd! " + ex;
            }

Nie przechwytuje mi błędu, dalej mogę wpisywać silnie np: z 30 i wypisuje mi duże liczby, liczby ujemny czy też 0.

1

Ty masz w metodzie silnia rzucić wyjątek, nie obsługiwać.

    long silnia(int n)
    {
        if(n < 0 || n > 20) 
        {
            throw new ArgumentOutOfRangeException()
        }
        else
        ...
  }
0
bogdans napisał(a):

Ty masz w metodzie silnia rzucić wyjątek, nie obsługiwać.

    long silnia(int n)
    {
        if(n < 0 || n > 20) 
        {
            throw new ArgumentOutOfRangeException()
        }
        else
        ...
  }

A nie da się zrobić tak by program sam wyłapywał kiedy jest przekroczony? Żebym nie musiał pisać ifa z przedziału od 0 do 20?

0

Program nic sam nie robi, jedynie to, co mu zaprogramujesz.
Żebyś nie musiał programować, to po prostu zmień branżę.

0

Rozumiem, że tak się po prostu nie da? Okej, więc pobawię się takim ifem:

if(n < 0 || n > 20) 
        {
            throw new ArgumentOutOfRangeException()
        }

Dziękuję za każdą odpowiedź. Do zamknięcia.

2

Da się jak umieścisz fragment z przekroczeniem zakresu w bloku checked.

0

Możesz też zainteresować się klasą BigInteger. Tutaj zakresu nie przekroczysz, bo w teorii ta klasa nie jest niczym ograniczona.

1

Bardzo dziękuję każdemu za pomoc. Znalazłem rozwiązanie, którego wizje miałem w głowie.

try{
    checked
    {
    //liczenie silni.                     
    }
}
catch(OverflowException)
{
    textbox_Okno.Text = "Błąd! Za duża liczba!";
}

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