using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
   
   class Cat
   {
      private int age;

      public int Age
      {
         get { return age; }
         set { age = value; }
      }
      public Cat( int age )
      {
         this.age = age;
      }
   }

   // Niestandardowa klasa wyjątku
   public class CustomCatException :
      System.ApplicationException
   {
      public CustomCatException(string message)
         :
      base(message) // Przekazywanie komunikatu do klasy bazowej
      {

      }
   }

   class Tester
   {
      private void CheckCat(Cat testCat)
      {
         if (testCat.Age <= 0)
         {
            // Tworzenie egzemplarza niestandardowego wyjątku
            CustomCatException e = 
               new CustomCatException("Podany kot nie istnieje");
            e.HelpLink = 
               "http://www.libertyassociates.com/NoZeroDivisor.htm";
            throw e;
         }
      }
   
      private void CatManager(Cat kitty)
      {
         CheckCat(kitty);
         Console.WriteLine ("Zarządzam kotem, który ma " + kitty.Age + " lat");
      }

      public void Run()
      {
         try
         {
            Console.WriteLine(
               "Przydział zasobów, które wymagają zwolnienia");

            List<Cat> cats = new List<Cat>();
            cats.Add( new Cat( 7 ) );
            cats.Add( new Cat( -2 ) );

            CatManager( cats[0] ); // Przekazanie pierwszego kota
            CatManager( cats[1] ); // Przekazanie drugiego kota
 
            Console.WriteLine(
               "Program może, ale nie musi wyświetlić tego wiersza");
         }

         // Przechwytywanie niestandardowego wyjątku
         catch (CustomCatException e)
         {
            Console.WriteLine(
               "\nCustomCatException! Komunikat: {0}",
               e.Message);
            Console.WriteLine(
               "\nHelpLink: {0}\n", e.HelpLink);
         }

         catch ( System.ArgumentOutOfRangeException )
         {
            Console.WriteLine(
               "Często widziałam kota bez uśmiechu, \nale nigdy jeszcze " +
               "nie spotkałam uśmiechu bez kota" );
         }

         catch (Exception e)
         {
            Console.WriteLine("Przechwycono nieznany wyjątek" + e.Message);
         }

         finally
         {
            Console.WriteLine("Tu zwalnianie zasobów.");
         }
      }

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

		 Console.ReadLine();
      }
   }
}
