using System;

namespace TryAndCatchBlocks
{
    class Tester
    {

        static void Main()
        {
            Console.WriteLine("Wejście w Main()...");
            Tester t = new Tester();
            t.Run();
            Console.WriteLine("Wyjście z Main()...");
        }

        public void Run()
        {
            Console.WriteLine("Wejście w Run()...");
            Func1();
            Console.WriteLine("Wyjście z Run()...");
        }

        public void Func1()
        {
            Console.WriteLine("Wejście w Func1()...");
            Func2();
            Console.WriteLine("Wyjście z Func1()...");
        }

        public void Func2()
        {
            Console.WriteLine("Wejście w Func2()...");
            try
            {
                Console.WriteLine("Wejście w blok try...");
                throw new ApplicationException();
                // ten kod nigdy się nie wykona z powodu wyjątku
                Console.WriteLine("Wyjście z bloku try...");
            }
            catch
            {
                Console.WriteLine("Wyjątek przechwycony i obsłużony!");
            }
            Console.WriteLine("Wyjście z Func2()...");
        }
    }
}