Exception Класс
TOC
Свернуть оглавление
Развернуть оглавление
Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Exception - класс

 

Представляет ошибки, происходящие во время выполнения приложения.

Просмотреть исходный код .NET Framework для этого типа Reference Source.

Пространство имен:   System
Сборка:  mscorlib (в mscorlib.dll)

System.Object
  System.Exception
    Microsoft.Build.BuildEngine.InternalLoggerException
    Microsoft.Build.BuildEngine.InvalidProjectFileException
    Microsoft.Build.BuildEngine.InvalidToolsetDefinitionException
    Microsoft.Build.BuildEngine.RemoteErrorException
    Microsoft.Build.Exceptions.BuildAbortedException
    Microsoft.Build.Exceptions.InternalLoggerException
    Microsoft.Build.Exceptions.InvalidProjectFileException
    Microsoft.Build.Exceptions.InvalidToolsetDefinitionException
    Microsoft.Build.Framework.LoggerException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException
    Microsoft.JScript.CmdLineException
    Microsoft.JScript.ParserException
    Microsoft.VisualBasic.ApplicationServices.CantStartSingleInstanceException
    Microsoft.VisualBasic.ApplicationServices.NoStartupFormException
    Microsoft.VisualBasic.Compatibility.VB6.WebClassContainingClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassCouldNotFindEvent
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemCannotBeCurrentWebItem
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemRespondNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebClassUserWebClassNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebClassFileNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebItemNotValid
    Microsoft.VisualBasic.Compatibility.VB6.WebItemAssociatedWebClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemClosingTagNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadEmbeddedResource
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadTemplateFile
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNoTemplateSpecified
    Microsoft.VisualBasic.Compatibility.VB6.WebItemTooManyNestedTags
    Microsoft.VisualBasic.Compatibility.VB6.WebItemUnexpectedErrorReadingTemplateFile
    Microsoft.VisualBasic.CompilerServices.IncompleteInitialization
    Microsoft.VisualBasic.CompilerServices.InternalErrorException
    Microsoft.VisualBasic.FileIO.MalformedLineException
    System.Activities.DynamicUpdate.InstanceUpdateException
    System.Activities.ExpressionParser.SourceExpressionException
    System.Activities.Expressions.LambdaSerializationException
    System.Activities.InvalidWorkflowException
    System.Activities.Presentation.Metadata.AttributeTableValidationException
    System.Activities.Statements.WorkflowTerminatedException
    System.Activities.VersionMismatchException
    System.Activities.WorkflowApplicationException
    System.AddIn.Hosting.AddInSegmentDirectoryNotFoundException
    System.AddIn.Hosting.InvalidPipelineStoreException
    System.AggregateException
    System.ApplicationException
    System.ComponentModel.Composition.CompositionContractMismatchException
    System.ComponentModel.Composition.CompositionException
    System.ComponentModel.Composition.ImportCardinalityMismatchException
    System.ComponentModel.Composition.Primitives.ComposablePartException
    System.ComponentModel.DataAnnotations.ValidationException
    System.ComponentModel.Design.ExceptionCollection
    System.Configuration.Provider.ProviderException
    System.Configuration.SettingsPropertyIsReadOnlyException
    System.Configuration.SettingsPropertyNotFoundException
    System.Configuration.SettingsPropertyWrongTypeException
    System.Data.Linq.ChangeConflictException
    System.Diagnostics.Eventing.Reader.EventLogException
    System.Diagnostics.Tracing.EventSourceException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectExistsException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException
    System.DirectoryServices.Protocols.DirectoryException
    System.IdentityModel.AsynchronousOperationException
    System.IdentityModel.Metadata.MetadataSerializationException
    System.IdentityModel.Protocols.WSTrust.WSTrustSerializationException
    System.IdentityModel.RequestException
    System.IdentityModel.Selectors.CardSpaceException
    System.IdentityModel.Selectors.IdentityValidationException
    System.IdentityModel.Selectors.PolicyValidationException
    System.IdentityModel.Selectors.ServiceBusyException
    System.IdentityModel.Selectors.ServiceNotStartedException
    System.IdentityModel.Selectors.StsCommunicationException
    System.IdentityModel.Selectors.UnsupportedPolicyOptionsException
    System.IdentityModel.Selectors.UntrustedRecipientException
    System.IdentityModel.Selectors.UserCancellationException
    System.IdentityModel.Services.AsynchronousOperationException
    System.IdentityModel.Services.FederatedAuthenticationSessionEndingException
    System.IdentityModel.Services.FederationException
    System.IdentityModel.Services.WSFederationMessageException
    System.InvalidTimeZoneException
    System.IO.IsolatedStorage.IsolatedStorageException
    System.IO.Log.SequenceFullException
    System.Management.Instrumentation.InstrumentationBaseException
    System.Management.Instrumentation.WmiProviderInstallationException
    System.Net.Http.HttpRequestException
    System.Net.Mail.SmtpException
    System.Net.PeerToPeer.PeerToPeerException
    System.Runtime.CompilerServices.RuntimeWrappedException
    System.Runtime.DurableInstancing.InstancePersistenceException
    System.Runtime.Remoting.MetadataServices.SUDSGeneratorException
    System.Runtime.Remoting.MetadataServices.SUDSParserException
    System.Runtime.Serialization.InvalidDataContractException
    System.Security.RightsManagement.RightsManagementException
    System.ServiceModel.Channels.InvalidChannelBindingException
    System.SystemException
    System.Threading.BarrierPostPhaseException
    System.Threading.LockRecursionException
    System.Threading.Tasks.TaskSchedulerException
    System.TimeZoneNotFoundException
    System.Web.Query.Dynamic.ParseException
    System.Web.Security.MembershipCreateUserException
    System.Web.Security.MembershipPasswordException
    System.Web.UI.ViewStateException
    System.Web.UI.WebControls.EntityDataSourceValidationException
    System.Web.UI.WebControls.LinqDataSourceValidationException
    System.Windows.Automation.NoClickablePointException
    System.Windows.Automation.ProxyAssemblyNotLoadedException
    System.Windows.Controls.PrintDialogException
    System.Windows.Forms.AxHost.InvalidActiveXStateException
    System.Windows.Xps.XpsException
    System.Windows.Xps.XpsWriterException
    System.Workflow.Activities.Rules.RuleException
    System.Workflow.ComponentModel.Compiler.WorkflowValidationFailedException
    System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException
    System.Workflow.ComponentModel.WorkflowTerminatedException
    System.Workflow.Runtime.WorkflowOwnershipException
    System.Xaml.XamlException

[SerializableAttribute]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class Exception : ISerializable, _Exception

ИмяОписание
System_CAPS_pubmethodException()

Инициализирует новый экземпляр класса Exception.

System_CAPS_protmethodException(SerializationInfo, StreamingContext)

Инициализирует новый экземпляр класса Exception с сериализованными данными.

System_CAPS_pubmethodException(String)

Инициализирует новый экземпляр класса Exception с указанным сообщением об ошибке.

System_CAPS_pubmethodException(String, Exception)

Инициализирует новый экземпляр класса Exception указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение.

ИмяОписание
System_CAPS_pubpropertyData

Возвращает коллекцию пар ключ/значение, предоставляющие дополнительные сведения об исключении, определяемые пользователем.

System_CAPS_pubpropertyHelpLink

Получает или задает ссылку на файл справки, связанный с этим исключением.

System_CAPS_pubpropertyHResult

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.

System_CAPS_pubpropertyInnerException

Возвращает экземпляр класса Exception, который вызвал текущее исключение.

System_CAPS_pubpropertyMessage

Получает сообщение, описывающее текущее исключение.

System_CAPS_pubpropertySource

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.

System_CAPS_pubpropertyStackTrace

Получает строковое представление непосредственных кадров в стеке вызова.

System_CAPS_pubpropertyTargetSite

Возвращает метод, создавший текущее исключение.

ИмяОписание
System_CAPS_pubmethodEquals(Object)

Определяет, равен ли заданный объект текущему объекту.(Наследуется от Object.)

System_CAPS_protmethodFinalize()

Позволяет объекту попытаться освободить ресурсы и выполнить другие операции по очистке перед тем, как объект будет утилизирован сборщиком мусора. (Наследуется от Object.)

System_CAPS_pubmethodGetBaseException()

При переопределении в производном классе возвращает исключение Exception, которое является корневой причиной одного или нескольких последующих исключений.

System_CAPS_pubmethodGetHashCode()

Служит хэш-функцией по умолчанию.(Наследуется от Object.)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.

System_CAPS_pubmethodGetType()

Возвращает тип среды выполнения текущего экземпляра.

System_CAPS_protmethodMemberwiseClone()

Создает неполную копию текущего объекта Object.(Наследуется от Object.)

System_CAPS_pubmethodToString()

Создает и возвращает строковое представление текущего исключения.(Переопределяет Object.ToString().)

ИмяОписание
System_CAPS_proteventSerializeObjectState

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

System_CAPS_noteПримечание

Чтобы просмотреть исходный код .NET Framework для этого типа, см. раздел Reference Source. Просмотр исходного кода в Интернете, загружаемом справочнике для автономного просмотра и пошагово источники (включая исправления и обновления) во время отладки; see instructions.

Этот класс является базовым классом для всех исключений. При возникновении ошибки, система или текущее исполняемое приложение сообщает путем создания исключения, содержащий сведения об ошибке. После создается исключение обрабатывается приложением или используемым по умолчанию обработчиком исключений.

Содержание

Ошибки и исключения
Блоки try/catch
Возможности типов исключений
Свойства класса исключений
Особенности производительности
Повторной генерации исключения
Выбор стандартных исключений
Реализация пользовательских исключений

Ошибки во время выполнения могут происходить по разным причинам. Однако не все ошибки должны обрабатываться как исключения в коде. Ниже приведены некоторые категории ошибок, возникающих во время выполнения и соответствующие способов отреагировать на них.

  • Ошибки использования. Ошибка использования представляет ошибку в логику программы, что может привести к возникновению исключения. Тем не менее ошибка должно быть устранено не с помощью обработки исключений, но, изменив ошибочный код. Например, переопределение метода Object.Equals(Object) метод в следующем примере предполагается, что obj аргумент всегда должен иметь значение null.

    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
          // This implementation contains an error in program logic:
          // It assumes that the obj argument is not null.
          Person p = (Person) obj;
          return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          // The following throws a NullReferenceException.
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    

    NullReferenceException Исключение, которое возникает при objnull можно устранить путем изменения исходного кода для проверки null перед вызовом явно Object.Equals переопределение и повторной компиляции. В следующем примере содержится исправленный исходный код, который обрабатывает null аргумент.

    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
           // This implementation handles a null obj argument.
           Person p = obj as Person; 
           if (p == null) 
              return false;
           else
              return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    // The example displays the following output:
    //        p1 = p2: False
    

    Вместо использования ошибок обработки исключений, можно использовать Debug.Assert метода, чтобы идентифицировать ошибок использования в отладочных построениях и Trace.Assert метод выявления ошибок использования в отладочной и окончательной сборки. Для получения дополнительной информации см. Утверждения в управляемом коде.

  • Ошибки программы. Ошибка программы является ошибкой во время выполнения, обязательно неизбежны, написав код без ошибок.

    Это текстовое сообщение содержится в атрибуте Message объекта исключения. В этом случае можно избежать с помощью обработки исключений по работе с программной ошибки и вместо этого повторите операцию. Например, если ожидается, что пользователь ввода даты в определенном формате, можно выполнить синтаксический анализ строки даты, вызвав DateTime.TryParseExact метод, который возвращает Boolean значение, указывающее, операция синтаксического анализа успешность, вместо использования DateTime.ParseExact метод, который вызывает FormatException исключение, если строка даты невозможно преобразовать в DateTime значение. Аналогично, если пользователь пытается открыть файл, который не существует, сначала можно вызвать File.Exists метод для проверки, является ли файл существует и, если оно отсутствует, запрашивает у пользователя разрешение хочет создать его.

    В других случаях ошибки в программе отражает условия непредвиденной ошибки, которое может быть обработано в коде. Например даже если вы проверили, чтобы убедиться, что файл существует, его могут быть удалены, прежде чем его можно открыть, или он может быть поврежден. В этом случае при попытке открыть файл путем создания экземпляра StreamReader объекта или при вызове Open может вызвать метод FileNotFoundException исключение. В таких случаях следует использовать обработку исключений для устранения этой ошибки.

  • Сбои системы. Сбой системы является ошибкой во время выполнения, не могут быть обработаны программным образом удобным образом. Например, можно вызывать любой метод OutOfMemoryException исключение, если среда не удалось выделить дополнительную память. Как правило системные сбои не обрабатываются с помощью обработки исключений. Вместо этого можно использовать события, такие как AppDomain.UnhandledException и вызвать Environment.FailFast метода для входа сведения об исключении и уведомлять пользователя о сбое до завершения приложения.

Общеязыковая среда выполнения предоставляет модель обработки исключений, который основан на представлении исключений как объектов и разделении кода программы и кода обработки исключения на try блоков и catch блоков. Может быть один или несколько catch блоки, каждый из которых создан для обработки определенного типа исключения, или в одном блоке catch более конкретное исключение, чем другой.

Если приложение обрабатывает исключения, возникающие во время выполнения блока кода приложения, код должен быть помещен в try инструкции и называется try блок. Код приложения, который обрабатывает исключения, вызванные try блок, помещенный в catch инструкции и называется catch блок. Ноль или более catch связаны блоки try блок и каждая catch блок включает фильтр типов, который определяет тип исключений, обрабатываемых.

При возникновении исключения в try блока, система осуществляет поиск связанных catch блоков в порядке появления в коде приложения, пока не найдет catch блок, который обрабатывает исключение. Объект catch обрабатывает исключение типа T Если тип фильтра блока перехвата указывает T или любой тип, T является производным от. Система прекращает поиск после он находит первый catch блок, который обрабатывает исключение. По этой причине в коде приложения catch блок, который обрабатывает типа должны быть указаны до catch блок, который обрабатывает его базовые типы, как показано в следующем примере в этом разделе. Блок catch, который обрабатывает System.Exception указывается в последнюю очередь.

Если ни одна из catch блоки, связанных с текущим try блок обработки исключения и текущий try блока, вложены в другие try блоков в текущем вызове catch блоков, связанных с Далее включающий try ищутся блока. Если не catch блока исключения найден, система осуществляет поиск предыдущих уровней вложенности в текущем вызове. Если не catch блоков найден в текущем вызове, исключение передается вверх по стеку вызовов, и поиск в предыдущем кадре стека catch блок, который обрабатывает исключение. Поиск в стеке вызовов продолжается, пока исключение не будет обработано, или пока не закончатся в стеке вызовов. При достижении верхней части стека вызовов без поиск catch блок, который обрабатывает исключение, обработчик исключений по умолчанию обрабатывает его и приложение завершает работу.

Типы исключений поддерживают следующие функции:

  • Удобочитаемый текст с описанием ошибки. При возникновении исключения среда выполнения предоставляет текстовое сообщение для информирования пользователя о характере ошибки и предлагает способы ее устранения. Текстовое сообщение хранится в Message Свойства объекта исключения. Во время создания объекта исключения можно передать строку текста в конструктор для описания сведений данного исключения. Если аргумент сообщения об предоставляемых конструктору, используется сообщение по умолчанию. Дополнительные сведения см. в описании свойства Message.

  • Состояние стека вызова при возникновении исключения. StackTrace Несет трассировку стека, которую можно использовать, чтобы определить место возникновения ошибки в коде. Трассировка стека перечисляет все вызываемые методы и номера строк в исходном файле, в которой выполняются вызовы.

Exception Класс содержит ряд свойств, которые помогают определить расположение кода, тип, файл справки и причину исключения: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, и Data.

Если существует причинно-следственной связи между двух или нескольких исключений, InnerException свойство обслуживание этой информации. Внешнее исключение вызывается в ответ на это внутреннее исключение. Код, обрабатывающий внешнее исключение можно использовать сведения из более раннего внутреннего исключения для более качественной обработки ошибки. Дополнительные сведения об исключении могут храниться в виде коллекции пар "ключ значение" в Data свойство.

Строка сообщения об ошибке, передаваемая конструктору при создании объекта исключения, должна быть локализована и может быть передана из файла ресурсов с помощью ResourceManager класса. Дополнительные сведения о локализованных ресурсах см. в разделе Создание вспомогательных сборок для приложений для настольных систем и Упаковка и развертывание ресурсов в приложениях для настольных систем разделы.

Чтобы предоставить пользователю с подробными сведениями о причинах возникновения исключения HelpLink свойство может содержать URL-адрес (или URN) к файлу справки.

Exception Класс использует COR_E_EXCEPTION HRESULT, который имеет значение 0x80131500.

Список начальных значений свойств для экземпляра класса Exception см. в разделе Exception конструкторы.

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

Кроме того не вызывает исключение при достаточно кода возврата; не следует преобразовывать код возврата в исключение; сделать не контролирует перехвата исключения, игнорируйте его и затем продолжить обработку.

Во многих случаях обработчик исключений просто хочет передать исключение в вызывающий объект. Это часто происходит в:

  • Библиотека классов, который в свою очередь включает вызовы методов в библиотеке классов .NET Framework или другие библиотеки классов.

  • Приложение или библиотека, которая обнаруживает неустранимое исключение. Обработчик исключений можно занести исключение в журнал и заново создать исключение.

Для повторного создания исключения рекомендуется просто использовать исключение инструкции на языке C# и исключение инструкции в Visual Basic, не включая выражения. Это гарантирует, что все сведения стека вызовов сохраняется, когда исключение передается в вызывающий объект. Это показано в следующем примере. Метод расширения строки, FindOccurrences, включает один или несколько вызовов String.IndexOf(String, Int32) без проверки аргументов заранее.

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

public static class Library
{
   public static int[] FindOccurrences(this String s, String f)
   {
      var indexes = new List<int>();
      int currentIndex = 0;
      try {
         while (currentIndex >= 0 && currentIndex < s.Length) {
            currentIndex = s.IndexOf(f, currentIndex);
            if (currentIndex >= 0) {
               indexes.Add(currentIndex);
               currentIndex++;
            }
         }
      }
      catch (ArgumentNullException e) {
         // Perform some action here, such as logging this exception.

         throw;
      }
      return indexes.ToArray();
   }
}

Вызывающий объект вызывает FindOccurrences дважды. Во втором вызове к FindOccurrences, вызывающий объект передает null как строка поиска, какие варианты String.IndexOf(String, Int32) метод выдает исключение ArgumentNullException исключение. Это исключение обрабатывается FindOccurrences метод и передан вызывающей стороне. Поскольку инструкция throw используется без выражения, выходные данные примера показано, что сохраняется стек вызовов.

public class Example
{
   public static void Main()
   {
      String s = "It was a cold day when...";
      int[] indexes = s.FindOccurrences("a");
      ShowOccurrences(s, "a", indexes);
      Console.WriteLine();

      String toFind = null;
      try {
         indexes = s.FindOccurrences(toFind);
         ShowOccurrences(s, toFind, indexes);
      }
      catch (ArgumentNullException e) {
         Console.WriteLine("An exception ({0}) occurred.",
                           e.GetType().Name);
         Console.WriteLine("Message:\n   {0}\n", e.Message);
         Console.WriteLine("Stack Trace:\n   {0}\n", e.StackTrace);
      }
   }

   private static void ShowOccurrences(String s, String toFind, int[] indexes)
   {
      Console.Write("'{0}' occurs at the following character positions: ",
                    toFind);
      for (int ctr = 0; ctr < indexes.Length; ctr++)
         Console.Write("{0}{1}", indexes[ctr],
                       ctr == indexes.Length - 1 ? "" : ", ");

      Console.WriteLine();
   }
}
// The example displays the following output:
//    'a' occurs at the following character positions: 4, 7, 15
//
//    An exception (ArgumentNullException) occurred.
//    Message:
//       Value cannot be null.
//    Parameter name: value
//
//    Stack Trace:
//          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
//    ngComparison comparisonType)
//       at Library.FindOccurrences(String s, String f)
//       at Example.Main()

Напротив, если исключение вызывается повторно с помощью

оператор, полный стек вызова не сохраняются и пример создаст следующие выходные данные:

происходит в следующих позиций символов «»: 4, 7, 15, возникло исключение (ArgumentNullException). Сообщение об ошибке Не может иметь значение null. Имя параметра: значение трассировка стека: в Library.FindOccurrences (String s, строка f) на Example.Main()

Немного более сложно альтернатива — для генерации нового исключения, а также сохранить исходное исключение сведений стека вызовов в внутреннее исключение. Вызывающий объект можно затем использовать новое исключение InnerException свойство для извлечения кадра стека и другие сведения об исходном исключении. В этом случае является оператор throw:

throw new ArgumentNullException("You must supply a search string.",
                                e);

Пользовательский код, который обрабатывает исключение должно знать, что InnerException содержит сведения об исходном исключении, как показано на следующем обработчика исключений.

try {
   indexes = s.FindOccurrences(toFind);
   ShowOccurrences(s, toFind, indexes);
}
catch (ArgumentNullException e) {
   Console.WriteLine("An exception ({0}) occurred.",
                     e.GetType().Name);
   Console.WriteLine("   Message:\n{0}", e.Message);
   Console.WriteLine("   Stack Trace:\n   {0}", e.StackTrace);
   Exception ie = e.InnerException;
   if (ie != null) {
      Console.WriteLine("   The Inner Exception:");
      Console.WriteLine("      Exception Name: {0}", ie.GetType().Name);
      Console.WriteLine("      Message: {0}\n", ie.Message);
      Console.WriteLine("      Stack Trace:\n   {0}\n", ie.StackTrace);
   }
}
// The example displays the following output:
//    'a' occurs at the following character positions: 4, 7, 15
//
//    An exception (ArgumentNullException) occurred.
//       Message: You must supply a search string.
//
//       Stack Trace:
//          at Library.FindOccurrences(String s, String f)
//       at Example.Main()
//
//       The Inner Exception:
//          Exception Name: ArgumentNullException
//          Message: Value cannot be null.
//    Parameter name: value
//
//          Stack Trace:
//          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
//    ngComparison comparisonType)
//       at Library.FindOccurrences(String s, String f)

После создания исключения, часто можно использовать существующий тип исключений в .NET Framework вместо реализации пользовательского исключения. Следует использовать тип стандартное исключение в этих двух условий:

  • Создает исключение, вызвавшее ошибку использования (то есть, из-за ошибки в логике программы разработчика, который вызывает метод). Как правило, будет вызывать исключение, таких как ArgumentException, ArgumentNullException, InvalidOperationException, или NotSupportedException. Строка, которую предоставить конструктору объект исключения при создании экземпляра объекта исключения следует описания ошибки, таким образом, разработчик может устранить ее. Дополнительные сведения см. в описании свойства Message.

  • Обработки ошибок, можно передать вызывающему объекту с существующей исключения .NET Framework. Необходимо вызвать исключение наиболее производного возможные исключения. Например, если метод требует аргумента допустимого члена типа перечисления, необходимо вызвать исключение InvalidEnumArgumentException (наиболее производный класс), а не ArgumentException.

В следующей таблице перечислены распространенные типы исключений и условия, при которых будет вызывать их.

Exception

Condition

ArgumentException

Недопустимый аргумент отличных от null, который передается в метод.

ArgumentNullException

Аргумент, передаваемый в метод null.

ArgumentOutOfRangeException

Значение аргумента находится вне диапазона допустимых значений.

DirectoryNotFoundException

Часть пути к каталогу является недопустимым.

DivideByZeroException

Знаменатель в целое число или Decimal операции деления равен нулю.

DriveNotFoundException

Диск недоступен или не существует.

FileNotFoundException

Файл не существует.

FormatException

Значение не в соответствующий формат для преобразования из строки с помощью метода преобразования таких как Parse.

IndexOutOfRangeException

Индекс находится вне границ массива или коллекции.

InvalidOperationException

Вызов метода недопустим при текущем состоянии объекта.

KeyNotFoundException

Не удается найти указанный ключ для обращения к элементу в коллекции.

NotImplementedException

Метод или операция не реализованы.

NotSupportedException

Метод или операция не поддерживается.

ObjectDisposedException

Операция выполняется на объекте, который был удален.

OverflowException

Операции арифметического приведения или преобразования приводит к переполнению.

PathTooLongException

Путь или имя файла превышает максимальную длину, определенную системой.

PlatformNotSupportedException

Операция не поддерживается на текущей платформе.

RankException

Массив с неверным числом размерностей передается в метод.

TimeoutException

Истек интервал времени, выделенный для операции.

UriFormatException

Используется недопустимый универсальный код ресурса (URI).

В следующих случаях использование существующих исключения .NET Framework для обработки ошибки не подходит:

  • Когда исключение отражает уникальный программной ошибки, не может быть сопоставлен существующей исключения .NET Framework.

  • Если исключение требует обработки, отличается от обработку, которая подходит для существующей исключения .NET Framework или исключение должно однозначно из подобное исключение. Например, если вызывается ArgumentOutOfRangeException исключение при синтаксическом анализе числовое представление строки, которая выходит за пределы диапазона целочисленных типа целевого объекта, не нужно использовать то же исключение, ошибка, результаты из вызывающего объекта, не указав соответствующий ограниченного значений при вызове метода.

Exception Класс является базовым классом для всех исключений в .NET Framework. Многие производные классы полагаться на поведение унаследованных членов Exception класса; они не переопределяют члены Exception, ни они определяют уникальных элементов.

Чтобы определить собственный класс исключений:

  1. Определите класс, который наследует от Exception. При необходимости определите все уникальные члены, требует класс для предоставления дополнительных сведений об исключении. Например ArgumentException класс содержит ParamName свойство, которое указывает имя параметра, аргумент которого вызвала исключение, и RegexMatchTimeoutException включает свойство MatchTimeout свойство, указывающее интервал времени ожидания.

  2. При необходимости Переопределите любые наследуемые члены, функциональные возможности которых вы хотите изменить, или изменить. Обратите внимание, что большинство существующих классов, производных от Exception не переопределить поведение унаследованных членов.

  3. Определите, сериализуем ли объект пользовательского исключения. Сериализация позволяет сохранить сведения об исключении и сведения о исключения для совместного использования сервера и прокси-клиента в контексте удаленного взаимодействия. Чтобы сделать сериализуемым объекта исключения, пометьте его атрибутом SerializableAttribute атрибута.

  4. Определите конструкторы класса исключения. Как правило классы исключений имеют один или несколько из следующих конструкторов:

    • Exception(), который использует значения по умолчанию для инициализации свойства объекта исключения.

    • Exception(String), который инициализирует новый объект исключения с заданным сообщением об ошибке.

    • Exception(String, Exception), который инициализирует новый объект исключения с указанной ошибкой сообщением и внутренним исключением.

    • Exception(SerializationInfo, StreamingContext), который является protected конструктор, который инициализирует объект исключения из сериализованных данных. Необходимо реализовать этот конструктор, если вы решили сделать сериализуемый объект исключения.

Следующий пример иллюстрирует использование класса пользовательского исключения. Он определяет NotPrimeException исключение, возникающее, когда клиент пытается получить последовательность простых чисел, указав начальный номер, который не является простым. Исключение определяет новое свойство NonPrime, который возвращает не простых чисел, вызвавшего исключение. Помимо реализации защищенный конструктор и конструктор с SerializationInfo и StreamingContext параметров для сериализации, NotPrimeException класс определяет три дополнительных конструкторов для поддержки NonPrime свойство. Каждый конструктор вызывает конструктор базового класса, помимо сохранения из простых нечисловое значение. NotPrimeException Класс также помечается SerializableAttribute атрибута.

using System;
using System.Runtime.Serialization;

[Serializable()]
public class NotPrimeException : Exception
{
   private int notAPrime;

   protected NotPrimeException()
      : base()
   { }

   public NotPrimeException(int value) :
      base(String.Format("{0} is not a prime number.", value))
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message)
      : base(message)
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message, Exception innerException) :
      base(message, innerException)
   {
      notAPrime = value;
   }

   protected NotPrimeException(SerializationInfo info,
                               StreamingContext context)
      : base(info, context)
   { }

   public int NonPrime
   { get { return notAPrime; } }
}

PrimeNumberGenerator Класс, показанный в следующем примере используется решета Эратосфена для вычисления последовательность простых чисел от 2 до предела, указанных клиентом в вызове конструктора класса. GetPrimesFrom Метод возвращает всех простых чисел, которые больше или равны указанной нижней границы, но вызывает NotPrimeException Если, нижний предел не простых чисел.

using System;
using System.Collections.Generic;


[Serializable]
public class PrimeNumberGenerator
{
   private const int START = 2;
   private int maxUpperBound = 10000000;
   private int upperBound;
   private bool[] primeTable;
   private List<int> primes = new List<int>();

   public PrimeNumberGenerator(int upperBound)
   {
      if (upperBound > maxUpperBound)
      {
         string message = String.Format(
                           "{0} exceeds the maximum upper bound of {1}.",
                           upperBound, maxUpperBound);
         throw new ArgumentOutOfRangeException(message);
      }
      this.upperBound = upperBound;
      // Create array and mark 0, 1 as not prime (True).
      primeTable = new bool[upperBound + 1];
      primeTable[0] = true;
      primeTable[1] = true;

      // Use Sieve of Eratosthenes to determine prime numbers.
      for (int ctr = START; ctr <= (int)Math.Ceiling(Math.Sqrt(upperBound));
            ctr++)
      {
         if (primeTable[ctr]) continue;

         for (int multiplier = ctr; multiplier <= upperBound / ctr; multiplier++)
            if (ctr * multiplier <= upperBound) primeTable[ctr * multiplier] = true;
      }
      // Populate array with prime number information.
      int index = START;
      while (index != -1)
      {
         index = Array.FindIndex(primeTable, index, (flag) => !flag);
         if (index >= 1)
         {
            primes.Add(index);
            index++;
         }
      }
   }

   public int[] GetAllPrimes()
   {
      return primes.ToArray();
   }

   public int[] GetPrimesFrom(int prime)
   {
      int start = primes.FindIndex((value) => value == prime);
      if (start < 0)
         throw new NotPrimeException(prime, String.Format("{0} is not a prime number.", prime));
      else
         return primes.FindAll((value) => value >= prime).ToArray();
   }
}

Следующий пример вызывает два GetPrimesFrom метод с непростых чисел, один из которых пересекает границы домена приложения. В обоих случаях исключение создается и успешно обработано в коде клиента.

using System;
using System.Reflection;

class Example
{
   public static void Main()
   {
      int limit = 10000000;
      PrimeNumberGenerator primes = new PrimeNumberGenerator(limit);
      int start = 1000001;
      try
      {
         int[] values = primes.GetPrimesFrom(start);
         Console.WriteLine("There are {0} prime numbers from {1} to {2}",
                           start, limit);
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }

      AppDomain domain = AppDomain.CreateDomain("Domain2");
      PrimeNumberGenerator gen = (PrimeNumberGenerator)domain.CreateInstanceAndUnwrap(
                                        typeof(Example).Assembly.FullName,
                                        "PrimeNumberGenerator", true,
                                        BindingFlags.Default, null,
                                        new object[] { 1000000 }, null, null);
      try
      {
         start = 100;
         Console.WriteLine(gen.GetPrimesFrom(start));
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }
   }
}

В .NET для приложений Магазина Windows 8.x для Windows 8, некоторые сведения об исключении обычно теряется, когда исключение распространяется через кадры стека в .NET Framework. Начиная с .NET Framework 4.5.1 и Windows 8.1, общеязыковая среда выполнения продолжает использовать исходные Exception объекта, созданное исключение, если это исключение был изменен в кадре стека .NET Framework.

В следующем примере демонстрируется catch блок, который определен для обработки ArithmeticException ошибок. Это catch также блокировать перехватываются DivideByZeroException ошибок, поскольку DivideByZeroException является производным от ArithmeticException и не catch блока, явно определенные для DivideByZeroException ошибок.

using System;

class ExceptionTestClass 
{
   public static void Main() 
   {
      int x = 0;
      try 
      {
         int y = 100/x;
      }
         catch (ArithmeticException e) 
         {
            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
         }
         catch (Exception e) 
         {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
         }
   }	
}
/*
This code example produces the following results:

ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero.
   at ExceptionTestClass.Main()

*/

Universal Windows Platform
Доступно с 8
.NET Framework
Доступно с 1.1
Portable Class Library
Поддерживается в версиях: portable .NET platforms
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

Любые открытые статические (общие в Visual Basic) члены этого типа являются потокобезопасными. Потокобезопасность членов экземпляров не гарантируется.

Вернуться в начало
Показ:
© 2016 Microsoft