Obsługa niezdefiniowanych wyjątków

0

Dlaczego nie mogę przechwycić innego wyjątku niż zdefiniowany? Przecież ten ostatni blok nie zawiera się w DivideByZeroException.

         static int Dzielenie(int a, int b)
        {
            return a / b;

        }

        static void Main(string[] args)
        {
            Console.WriteLine("podaj a i b: ");
            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());

            try
            {
                Console.WriteLine(Dzielenie(a, b));
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("Nie możesz dzielić przez 0!");
            }
            catch
            {
                Console.WriteLine("wystąpił inny błąd!");
            }
0

Jak nie możesz ?

0

Przy wpisaniu tekstu nie wyświetla mi bloku ogólnego catch

edit. spróbowałem teraz wykorzystać TryParse, ale po wpisaniu tekstu wykonuje się jeszcze blok DivideByZeroException :\

static int Dzielenie(int a, int b)
        {
            return a / b;
        }
        
        static void Main(string[] args)
        {
            Console.WriteLine("podaj a i b: ");

            string a, b;
            int wyja, wyjb;

            a = Console.ReadLine();
            b = Console.ReadLine();

            bool czyUdanaKonwersjaA = int.TryParse(a, out wyja);
            bool czyUdanaKonwersjaB = int.TryParse(b, out wyjb);

            if(czyUdanaKonwersjaA==false || czyUdanaKonwersjaB == false)
            {
                Console.WriteLine("Konwersja niepomyślna!");
            }

            try
            {
                Console.WriteLine(Dzielenie(wyja, wyjb));
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("Nie możesz dzielić przez 0!");
            }
            catch
            {
                Console.WriteLine("Inny błąd!");
            }
        }
1

Wyjątek zostaje złapany i obsłużony, na tym się kończy, czego więcej oczekujesz? Jakbyś zrobił tak:

try
{
    Console.WriteLine(Dzielenie(a, b));
    throw new Exception();
}

to wykonałby się tylko drugi blok catch.

Ogólnie: nie ma sytuacji w której dwa równorzędne(niezagnieżdżone) bloki catch się wykonają.

1
using System;
class Program
{
    static int Dzielenie(int a, int b)
    {
        return a / b;

    }

    static void Main(string[] args)
    {
       
            Console.WriteLine("podaj a i b: ");
 try
        {
            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());


            Console.WriteLine(Dzielenie(a, b));
        }
        
       
        catch (DivideByZeroException)
        {
            Console.WriteLine("Nie możesz dzielić przez 0!");
        }
        catch
        {
            Console.WriteLine("wystąpił inny błąd!");
        }
    }
}
1

Ten drugi kod co dałeś to w If powinno być throw new Exception i wtedy wejdzie do drugiego catch. Bo inaczej int domyślnie mają 0 więc masz wyjątek związany z dzieleniem bo wszystko się wykonuje i oczywiście ten if w Tryu

1

`Naucz się czytać komunikaty o błędach, których fragment kodu powoduje wyjątek, gdzie możesz go przechwycić

Unhandled Exception: System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(ReadOnlySpan`1 str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(ReadOnlySpan`1 s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at Program.Main(String[] args) in  C#\ConsoleApp\Program.cs:line 15

Masz podane 4 miejsca ale masz dostęp tylko to metody Main . Ja w 15 linijce podałem literę i dlatego wywaliło wyjątek w 15 linijce.

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