Obsługa wyjątków w C# - podstawy - pytanie

0

Cześć Wam. Potrafi ktoś wyjaśnić czemu nie mogę wyłapać tego wyjątku i program się nie kompiluje? Oto kod. Specjalnie popełniłem błąd - próbuję przypisać stringa do miejsca gdzie powinien być integer.

class Tablica
    {
        int y;
        int[] x = new int[10];

        public Tablica(int[] x, int y)
        {
            for (int i = 0; i < x.Length; i++)
            {
                x[i] = y * 2 * i;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];
            int multi = "x";
            
            try
            {
                Tablica x = new Tablica(arr, multi);

            }
            catch(SystemException e)
            {
                Console.WriteLine("Blad ogolny");
                Console.WriteLine(e.Message);
            }
            

        }
    }
3

Dlatego właśnie się nie kompiluje.

0
somekind napisał(a):

Dlatego właśnie się nie kompiluje.

Ale czemu mi nie wyłapuje błędu przy obsłudze wyjątku?

4

tak intrygującego pomysłu dawno nie słyszałem, serio

jakby wyjątki powodowały że niepoprawny kod będzie się kompilował ;)

0

Chyba nie odróżniasz kompilacji od uruchomienia programu. Wciskasz start w VS i uważasz że powinno wypluć wiadomość z catch? Na dodatek chyba nie doczytales o try/catch bo celowy błąd umieściłeś poza nim.

0

Może prościej. Przypisanie złej wartości typu jest tak podstawowym błędem że na poziomie idę wyskakuje Ci błąd, dlatego kompilator nie kompiluje programu. Jeśli chcesz popełnić błąd by przetestować wyłapywanie to np. spróbuj porównać steinga który będzie null-em z jakąś wartością.
No i zle zastosowałes try-catch

2

Generalnie sa 2 rodzaje bledow:

  • Te ktore kompilator wychwyci i nie pozowli skompilowac aplikacji (taki ty popelniles)
  • Te ktore wyhodza w rune time czyli gdy program juz chodzi (i ty potrzebujesz takiego by zlapc wyjatek).
    Juz ktos ci w komentarzu wspomnial bys sprobowal wartosc sparsowac ;)
1
Akihito napisał(a):

Generalnie sa 2 rodzaje bledow:

  • Te ktore kompilator wychwyci i nie pozowli skompilowac aplikacji (taki ty popelniles)
  • Te ktore wyhodza w rune time czyli gdy program juz chodzi (i ty potrzebujesz takiego by zlapc wyjatek).
    Juz ktos ci w komentarzu wspomnial bys sprobowal wartosc sparsowac ;)

Tak, ale można też zrobić w ten sposób:

throw new Exception();

No i oczywiście w try... catch... czyli tak jak autor chciał

try{
throw new Exception();
} catch (Exception ex){
Console.WriteLine("Error: " + ex)
}

Najprostszy z możliwych przykładów :D
Oczywiście zawsze będzie tutaj rzucało wyjątek ale jest tak jak autor chciał

Jeszcze tak na załączniku @greg_vv jak kolega wyżej wspomniał, nie da rady zrobić

int x = "y";

ani też

int x = (int) "y";

ponieważ edytory i wgrane do nich kompilatory na "live" nie są tak głupie i nie pozwolą ci tego skompilować
Po 2. źle masz umieszczony try... catch... w wysłanym przez ciebie kodzie

Życze miłego dnia ;)

0

kto w catch personalizuje komunikaty o błędzie? nie tędy droga

0
greg_vv napisał(a):
somekind napisał(a):

Dlatego właśnie się nie kompiluje.

Ale czemu mi nie wyłapuje błędu przy obsłudze wyjątku?

Wyjątki są łapane dla programu który jest wykonywany. Ten nie zostanie wykonany, bo nie zostanie skompilowany, bo masz błąd typów zmiennych. Środowisko IDE nie jest głupie i nie pozwoli Ci na taki jawny błąd. Wyjątki służą do obsługi nie przewidywalnych błędów niemożliwych do przewidzenia na etapie pisania kodu (choć w sumie możliwych, bo po to te wyjątki piszemy).

Tutaj jest to co chyba chciałeś osiągnąć:

using System;
class Tablica
{
    int[] x = new int[10];

    public Tablica(int[] x, int y)
    {
        for (int i = 0; i < x.Length; i++)
        {
            x[i] = y * 2 * i;
        }
    }
}

class Program
{
    static void Main()
    {
        int[] arr = new int[10];

        Console.WriteLine("Wprowadź wartość:");        

        try
        {
            int multi = Int32.Parse(Console.ReadLine());
            Tablica x = new Tablica(arr, multi);
        }
        catch (SystemException e)
        {
            Console.WriteLine("Blad ogolny");
            Console.WriteLine(e.Message);
        }

        

        Console.ReadKey();
    }
}

Obsługa wyjątku dla danej linii/bloku kodu odbywa się wewnątrz funkcji "try{}". Teraz w konsoli jak podasz liczbę to program wykona się prawidłowo bez wyjątku. A jak wprowadzisz cokolwiek innego niż liczbę to zostanie wyłapany błąd.
Popraw mnie ktoś jak źle myślę :)

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