Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Обработка исключений.

С Понятием исключения вы встречались в курсе С++.Настало время рассмотреть его в аспекте С#. Исключения в С# представлены классами. Все классы исключений могут быть унаследованы от встроенного класса исключений Exception, который является частью пространства имен System. Именно поэтому все исключения представляют собой подклассы класса Exception.Ниже показана иерархия наследования класса Exception.

  Exception
      ApplicationException
      CodeDomSerializerException
      InvalidPrinterException
      IOException
      IsolatedStorageException
      PathTooLongException
      CookieException
      ProtocolViolationException
      WebException
      MissingManifestResourceException
      SUDSGeneratorException
      SUDSParserException
      SystemException
      UriFormatException
      SoapException

Внимательно взглянув на схему, вы увидите россыпь классов. Из всех них нас сейчас волнуют только 2 класса исключений – ApplicationException и SystemException.Они определяют две общие категории исключений: программные и исключения, образованные средой выполнения (т.е. CLR). Рассмотрим иерархию, происходящую из SystemException.

    SystemException
 	 AppDomainUnloadedException
         ArgumentException
         ArithmeticException
         ArrayTypeMismatchException
         BadImageFormatException
         CannotUnloadAppDomainException
         LicenseException
         WarningException
         ConfigurationException
         InstallException
         ContextMarshalException
         DataException
         DBConcurrencyException
         SqlException
         SqlTypeException
         RegistrationException
         ServicedComponentException
         ExecutionEngineException
         FormatException
         IndexOutOfRangeException
         InvalidCastException
         InvalidOperationException
         InvalidProgramException
         InternalBufferOverflowException
         ManagementException
         MemberAccessException
         MulticastNotSupportedException
         NotImplementedException
         NotSupportedException
         NullReferenceException
         OutOfMemoryException
         RankException
         AmbiguousMatchException
         ReflectionTypeLoadException
         ExternalException
         InvalidComObjectException
         InvalidOleVariantTypeException
         MarshalDirectiveException
         SafeArrayRankMismatchException
         SafeArrayTypeMismatchException
         RemotingException
         ServerException
         SerializationException
         CryptographicException
         PolicyException
         SecurityException
         VerificationException
         XmlSyntaxException
         TimeoutException
         StackOverflowException
         SynchronizationLockException
         ThreadAbortException
         ThreadInterruptedException
         ThreadStateException
         TypeInitializationException
         TypeLoadException
         TypeUnloadedException
         UnauthorizedAccessException
         XmlSchemaException
         XmlException
         XsltException

Безусловно, такая обширная иерархия поражает! Каких в ней только классов нет, например :ArithmeticException – класс, который представляет арифметические исключения такие как DivideByZeroException (деление на ноль, наследуется из ArithmeticException) или OverflowException (переполнение, наследуется из ArithmeticException) и т.д. На основе класса исключений ApplicationException можно будет сформировать свои пользовательские классы исключений.

try/catch и все,все,все ...

Вся обработка исключений строится на 4 ключевых словах C#: try,catch,throw,finally.Первые три вы уже знаете из курса С++.В C# они используются приблизительно также. Приведем ряд примеров, для того чтобы показать принцип их работы.

using System;
class Sample
{
	static void Main() 
	{
		try{
			int a=3;
			int b =0;
			int c =a/b;
			// Деление на ноль
			Console.WriteLine(c);
		}
		catch(DivideByZeroException){//сработает данный catch
			Console.WriteLine("Деление на ноль !!!");
		}
		Console.Read();
	
	}
}

Следующий пример показывает принцип работы нескольких catch.

using System;
class Sample
{
	static void Main() 
	{
		try{
			int []ar = {4,2,8,4,2,6};
			int []br = {2,2,4,0,2};
			for(int i=0;i<ar.Length;i++){
				try{
					Console.WriteLine("{0}",ar[i]/br[i]);
				}
				catch(DivideByZeroException a){
					Console.WriteLine("Деление на ноль !!!");
				}
				//неправильный индекс
				catch(IndexOutOfRangeException b){
					Console.WriteLine("Выход за пределы");
				}
			}
			ar[50]=67;
		}
		// аналог catch(...)
		catch{
			Console.WriteLine("Неизвестная Ошибка");
		}
		Console.Read();
	
	}
}

Для генерации исключения программно используется throw.Синтаксис использования:

throw obj

obj - объект класса исключения от наследованного от класса Exception. Рассмотрим пример:

using System;
class Sample
{
	static void Main() 
	{
		try{
			throw new DivideByZeroException();
		}
		catch(DivideByZeroException e){
			Console.WriteLine("Деление на Ноль");
		}
		// аналог catch(...)
		catch{
			Console.WriteLine("Неизвестная Ошибка");
		}
		Console.Read();
	
	}
}

И, наконец, finally.Это блок кода, который вызывается после выхода из try/catch, помещается в конец последовательности try/catch.Блок finally вызывается в любом случае в не зависимости от того появилось исключение или нет.Например:

using System;
class Sample
{
	static void Main() 
	{
		try{
			int a=3;
			int b=0;
			Console.WriteLine(a/b);			
		}
		catch(DivideByZeroException e){
			Console.WriteLine("Деление на Ноль");
		}
		finally{
			Console.WriteLine("Bye");
		}
		
		Console.Read();
	
	}
}


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru