//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
namespace Exceptions
{
	class UserDefinedException : Exception 
	{
		public UserDefinedException(String s) : base(s) { }
	}
	class TestException 
	{
		public static void Main(String[] args) 
		{
			string [] s = new string [] { "divide", "null", "array", "user" };
			for (int i = 0; i < s.Length; i++) 
			{
				try 
				{
					exceptionGenerator(s[i]);
					Console.WriteLine("TestException \"" + s[i] + "\" nie zgłosił wyjątku");
				} 
				catch (Exception e) 
				{
					Console.WriteLine("TestException \"" + s[i] + "\" zgłosił wyjątek " + e.GetType());
					Console.WriteLine("        informujący: " + e.Message);
				}
			}
		}
		static int exceptionGenerator(String s)
		{
			try 
			{
				if (s.Equals("divide")) 
				{
					int i = 0;
					return i/i;
				}
				if (s.Equals("null")) 
				{
					s = null;
					return s.Length;
				}
				if (s.Equals("array")) 
				{
					int [] ia = {1, 2 ,3 ,4};
					return ia[ia.Length];
				}
				if (s.Equals("user"))
					throw new UserDefinedException("UserDefinedException zgłoszony przez exceptionGenerator");
				return 0;
			} 
			finally 
			{
				Console.WriteLine("[exceptionGenerator(\"" + s + "\") zakończył pracę]");
			}
		}
	}
}
