Ten artykuł został przetłumaczony przez maszynę. Aby wyświetlić jego treść w języku angielskim, zaznacz pole wyboru Angielski. Możesz też wyświetlić angielski tekst w okienku wyskakującym, przesuwając wskaźnik myszy nad konkretny tekst”.
Tłumaczenie
Angielski

Klasa Exception

.NET Framework (current version)
 

Data opublikowania: październik 2016

Reprezentuje błędy występujące podczas wykonywania aplikacji.

Aby przeglądać kod źródłowy .NET Framework dla tego typu, zobacz Reference Source.

Przestrzeń nazw:   System
Zestaw:  mscorlib (w 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

NazwaOpis
System_CAPS_pubmethodException()

Inicjuje nowe wystąpienie Exception klasy.

System_CAPS_protmethodException(SerializationInfo, StreamingContext)

Inicjuje nowe wystąpienie Exception klasy przy użyciu danych serializacji.

System_CAPS_pubmethodException(String)

Inicjuje nowe wystąpienie Exception klasy z określonym komunikatem o błędzie.

System_CAPS_pubmethodException(String, Exception)

Inicjuje nowe wystąpienie Exception klasy z określonym komunikatem o błędzie i odwołanie do wewnętrznego wyjątku, który jest przyczyną tego wyjątku.

NazwaOpis
System_CAPS_pubpropertyData

Pobiera kolekcję pary klucz wartość, które zapewniają dodatkowe zdefiniowane przez użytkownika informacji o wyjątku.

System_CAPS_pubpropertyHelpLink

Pobiera lub ustawia łącze do pliku pomocy skojarzonego z tym wyjątkiem.

System_CAPS_pubpropertyHResult

Pobiera lub ustawia zakodowaną wartość liczbową HRESULT, przypisaną do określonych wyjątków.

System_CAPS_pubpropertyInnerException

Pobiera Exception wystąpienia, który spowodował bieżący wyjątek.

System_CAPS_pubpropertyMessage

Pobiera komunikat, który opisuje bieżący wyjątek.

System_CAPS_pubpropertySource

Pobiera lub ustawia nazwę aplikacji lub obiekt, który powoduje błąd.

System_CAPS_pubpropertyStackTrace

Pobiera reprezentację ciągu natychmiastowe ramek na stosie wywołań.

System_CAPS_pubpropertyTargetSite

Pobiera metodę, która wygenerowała bieżący wyjątek.

NazwaOpis
System_CAPS_pubmethodEquals(Object)

Sprawdza, czy podany obiekt jest równy aktualnemu obiektowi (Dziedziczone z Object).

System_CAPS_protmethodFinalize()

Pozwala, aby obiekt spróbował zwolnić zasoby i wykonał inne operacje czyszczenia, zanim zostanie odzyskany przez moduł zbierający elementy bezużyteczne. (Dziedziczone z Object).

System_CAPS_pubmethodGetBaseException()

Gdy zostanie zastąpione w klasie pochodnej, zwraca Exception czyli przyczynę jeden lub więcej kolejnych wyjątków.

System_CAPS_pubmethodGetHashCode()

Służy jako domyślna funkcji mieszania.(Dziedziczone z Object).

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Gdy zostanie zastąpione w klasie pochodnej, ustawia SerializationInfo informacje o wyjątku.

System_CAPS_pubmethodGetType()

Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia.

System_CAPS_protmethodMemberwiseClone()

Tworzy płytką kopię bieżącego Object.(Dziedziczone z Object).

System_CAPS_pubmethodToString()

Tworzy i zwraca reprezentację tekstową bieżącego wyjątku. (Przesłania Object.ToString()).

NazwaOpis
System_CAPS_proteventSerializeObjectState

Występuje, gdy wyjątek jest serializowana utworzyć obiekt stanu wyjątek, który zawiera serializowane dane o wyjątku.

System_CAPS_noteUwaga

Aby wyświetlić kod źródłowy .NET Framework dla tego typu, zobacz Reference Source. Przeglądanie kodu źródłowego w trybie online, Pobierz odwołanie do przeglądania w trybie offline i postępuj zgodnie z instrukcjami źródła (w tym poprawki i aktualizacje) podczas debugowania. see instructions.

Ta klasa jest klasą podstawową dla wszystkich wyjątków. Po wystąpieniu błędu systemu lub aktualnie wykonywane aplikacji zgłasza zgłaszając wyjątek, który zawiera informacje o błędzie. Po jest zgłaszany wyjątek, jest to obsługiwane przez aplikację lub przez domyślny program obsługi wyjątków.

W tej sekcji:

Błędy i wyjątki
Bloki try/catch
Funkcje typu wyjątku
Właściwości klasy wyjątku
Zagadnienia dotyczące wydajności
Ponownego zgłaszania wyjątku
Wybieranie standardowych wyjątków
Implementowanie wyjątków niestandardowych

Mogą wystąpić błędy czasu wykonywania różnych przyczyn. Jednak nie wszystkie błędy powinny być traktowane jako wyjątki w kodzie. Poniżej przedstawiono niektóre kategorie błędy, które mogą wystąpić w czasie wykonywania i odpowiednie sposoby odpowiadanie na.

  • Błędy użycia. Błąd użycia reprezentuje błąd logiki program, który może spowodować wyjątek. Jednak błąd powinny być kierowane nie za pośrednictwem obsługi wyjątków, ale modyfikując nieprawidłowy kod. Na przykład zastąpienia Object.Equals(Object) Metoda w następującym przykładzie zakłada się, że obj argument musi być zawsze inną niż 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 Wyjątek, który powoduje podczas obj jest null można wyeliminować, modyfikując kodu źródłowego do testowania jawnie null przed wywołaniem funkcji Object.Equals zastępowania i ponowną kompilację. Poniższy przykład zawiera kod źródłowy poprawiony, który obsługuje null argumentu.

    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
    

    Zamiast korzystać z obsługi błędów użycia wyjątków, można użyć Debug.Assert metodę, aby zidentyfikować błędy użycia w kompilacjach debugowania i Trace.Assert tworzy metodę, aby zidentyfikować błędy użycia w debug i release. Aby uzyskać więcej informacji, zobacz Potwierdzenia w zarządzanym kodzie.

  • Błędy programu. Błąd programu jest błąd czasu wykonywania, który nie zawsze można uniknąć przez napisanie kodu bez błędów.

    W niektórych przypadkach błąd programu mogą uwzględniać warunek błędu oczekiwanego lub procedur. W takim przypadku można uniknąć transakcji z powodu błędu programu i zamiast tego spróbuj wykonać operację ponownie przy użyciu obsługi wyjątków. Na przykład, jeśli użytkownik powinien wprowadzania daty w określonym formacie, można przeanalizować ciągu daty przez wywołanie metody DateTime.TryParseExact metody, która zwraca Boolean wartość, która wskazuje, czy operacja analizy zakończyło się pomyślnie, zamiast używać DateTime.ParseExact metody, która zgłasza FormatException wyjątek, jeśli nie można przekonwertować ciągu daty DateTime wartość. Podobnie, jeśli użytkownik spróbuje otworzyć plik, który nie istnieje, można wywołać File.Exists aby sprawdzić, czy plik istnieje, a jeśli nie, monitować użytkownika, czy użytkownik chce, aby go utworzyć.

    W innych przypadkach błąd programu odzwierciedla nieoczekiwany błąd, który może być obsługiwany w kodzie. Na przykład nawet jeśli została sprawdzona, aby upewnić się, że plik istnieje, jego mogą zostać usunięte przed otwarciem lub może być uszkodzony. W takim przypadku próby otwarcia pliku przez utworzenie wystąpienia StreamReader obiektu lub wywoływania Open Metoda może zgłaszać FileNotFoundException wyjątek. W takich przypadkach należy użyć obsługi wyjątków, aby odzyskać z błędu.

  • Awarie systemu. Awaria systemu jest błąd czasu wykonywania, które nie mogą być obsługiwane programowo w istotny sposób. Na przykład można zgłosić dowolną metodę OutOfMemoryException wyjątek, jeśli nie można przydzielić dodatkową pamięć środowiska uruchomieniowego języka wspólnego. Normalnie awarie systemu nie są obsługiwane przy użyciu obsługi wyjątków. Zamiast tego można użyć zdarzenia, takie jak AppDomain.UnhandledException i wywołać Environment.FailFast Metoda rejestrować informacje wyjątek i powiadamiać użytkownika o awarii, zanim aplikacja zostanie zakończona.

Środowisko uruchomieniowe języka wspólnego udostępnia model obsługi wyjątków, który opiera się na reprezentację wyjątki jako obiekty i rozdzielenie kodu programu i kodu do obsługi wyjątków try bloków i catch bloki. Może istnieć jeden lub więcej catch blokuje każdego przeznaczone do obsługi określonego typu wyjątku lub jednego bloku przechwytuje wyjątek bardziej precyzyjny niż inny blok.

Jeśli aplikacja obsługuje wyjątki, które występują podczas realizacji bloku kodu aplikacji, kod musi się znajdować w try instrukcji i nosi nazwę try bloku. Kod aplikacji, która obsługuje wyjątki generowane przez try bloku jest umieszczana w catch instrukcji i nosi nazwę catch bloku. Zero lub więcej catch Bloki są skojarzone z try bloku, a każdy catch bloku zawiera typ filtru, który określa typy obsługi wyjątków.

Gdy wystąpi wyjątek w try blok, system wyszukuje skojarzonego catch bloków w kolejności, są wyświetlane w kodzie aplikacji, lokalizując catch bloku, który obsługuje wyjątek. A catch bloku obsługuje wyjątek typu T Jeśli Określa filtr typu bloku catch T lub dowolny typ T pochodną. Wyszukiwanie po znajdzie pierwszy zatrzymania systemu catch bloku, który obsługuje wyjątek. Z tego powodu w kodzie aplikacji catch bloku, który obsługuje typ muszą zostać określone przed catch bloku, który obsługuje jej typów podstawowych, jak pokazano w przykładzie poniżej w tej sekcji. W bloku catch, która obsługuje System.Exception jest określony jako ostatnia.

Jeśli żadna z catch Bloki skojarzone z bieżącym try bloku obsługi wyjątków i bieżącej try bloku jest zagnieżdżane w innych try bloków w bieżącym wywołaniu catch Bloki skojarzone z następnym otaczający try bloku są przeszukiwane. Jeśli nie catch bloku wyjątku zostanie znaleziony, system wyszukuje poprzednich poziomów zagnieżdżenia w bieżącym wywołaniu. Jeśli nie catch zablokować wyjątek został znaleziony w bieżącym wywołaniu, wyjątku jest przekazywany do stosu wywołań i poprzedniej ramki stosu są wyszukiwane catch bloku, który obsługuje wyjątek. Wyszukiwanie stosu wywołań jest kontynuowane, aż do obsługi wyjątku lub istnieje więcej ramek na stosie wywołań. Po osiągnięciu górnej części stosu wywołań nie catch bloku, który obsługuje wyjątek domyślny program obsługi wyjątków obsługuje on i zamyka aplikację.

Typy wyjątków obsługuje następujące funkcje:

  • Czytelny dla człowieka tekst, który opisuje błąd. Po wystąpieniu wyjątku, środowisko uruchomieniowe sprawia, że wiadomości SMS poinformowania użytkownika o charakterze błędu i zaproponować akcji do rozwiązania problemu. Ta wiadomość SMS jest przechowywany w Message Właściwości obiektu wyjątku. Podczas tworzenia obiektu wyjątku można przekazać do konstruktora opisujący szczegóły tego wyjątku określonego ciągu tekstowego. Jeśli nie błąd wiadomości zostaną dostarczone argumenty do konstruktora, używany jest domyślny komunikat o błędzie. Aby uzyskać więcej informacji, zobacz Message Właściwości.

  • Stan stos wywołań podczas zgłoszenia wyjątku. StackTrace Właściwość prowadzi ślad stosu, który może służyć do określenia, gdzie występuje błąd w kodzie. Ślad stosu wymieniono wywoływanych metod i numerów wierszy w pliku źródłowym, gdzie wywołań.

Exception Klasa zawiera wiele właściwości, które pomagają identyfikować lokalizacji kodu, typ, plik pomocy i Przyczyna wyjątku: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, i Data.

Gdy istnieje przyczynowego między kilkoma wyjątkami, InnerException właściwość przechowuje te informacje. Zewnętrzne wyjątku w odpowiedzi na ten wyjątek wewnętrzny. Kod, który obsługuje wyjątek zewnętrznego można użyć informacji z wcześniej wyjątek wewnętrzny do odpowiedniej obsługi błędu. Dodatkowe informacje o wyjątku, mogą być przechowywane jako zbiór pary klucz wartość w Data Właściwości.

Ciąg komunikatu o błędzie, który jest przekazywany do konstruktora podczas tworzenia obiektu wyjątku powinien być zlokalizowany i mogą być dostarczane z pliku zasobów za pomocą ResourceManager klasy. Aby uzyskać więcej informacji na temat zlokalizowanych zasobów, zobacz Tworzenie zestawów satelickich dla aplikacji klasycznych i Opakowanie i wdrażanie zasobów w aplikacjach klasycznych Tematy.

Aby przyznać użytkownikowi o dodatkowe informacje o dlaczego wystąpił wyjątek HelpLink właściwość może zawierać adres URL (lub URN) do pliku pomocy.

Exception Klasa używa COR_E_EXCEPTION HRESULT, która ma wartość 0x80131500.

Lista początkowe wartości właściwości wystąpienia Exception zobacz Exception konstruktorów.

Zgłaszanie lub Obsługa wyjątku zużywa znaczną ilość zasobów systemowych i czasu wykonywania. Zgłaszają wyjątki tylko do obsługi warunków naprawdę nadzwyczajne, do obsługi zdarzeń przewidywalne lub Sterowanie przepływem. Na przykład w niektórych przypadkach, na przykład gdy projektujesz bibliotekę klas jest uzasadnione zgłosić wyjątek, jeśli argument metody jest nieprawidłowy, ponieważ oczekuje metodę za pomocą prawidłowych parametrów. Metoda nieprawidłowy argument, jeśli nie jest wynikiem błędu użycia, oznacza, że coś nadzwyczajne wystąpił. Z drugiej strony nie zgłosić wyjątek, jeśli dane wejściowe użytkownika jest nieprawidłowy, ponieważ można oczekiwać, że użytkownicy czasami wprowadzić nieprawidłowe dane. Zamiast tego zapewniają mechanizm ponawiania, aby użytkownicy mogli wprowadzać prawidłowych danych wejściowych. Nie należy używać wyjątków do obsługi błędów użycia. Zamiast tego należy użyć potwierdzenia Aby zidentyfikować i poprawić błędy użycia.

Ponadto nie zgłosić wyjątek, gdy kod powrotny jest wystarczające; nie wolno konwertować zwrócony kod wyjątku; i wykonaj nie rutynowo catch wyjątek, go zignorować, a następnie kontynuować przetwarzanie.

W wielu przypadkach obsługi wyjątków chce po prostu przekazać wyjątek do obiektu wywołującego. Najczęstszą przyczyną tego błędu w:

  • Biblioteka klas, która z kolei otacza wywołania metod w bibliotece klas programu .NET Framework lub inne biblioteki klas.

  • Aplikacja lub biblioteka, który napotkał wyjątek krytyczny. Obsługa wyjątków zalogować wyjątek i ponownie zgłosić wyjątek.

Zalecanym sposobem ponownie zgłosić wyjątek jest po prostu użyć throw instrukcji w języku C# i Throw instrukcji w języku Visual Basic nie umieszczono wyrażenia. Daje to gwarancję, że wszystkie informacje stosu wywołań są zachowywane, jeśli wyjątek jest propagowana do obiektu wywołującego. W poniższym przykładzie pokazano to. Metoda rozszerzenia ciąg FindOccurrences, otacza jednego lub wielu wywołań do String.IndexOf(String, Int32) bez uprzedniego sprawdzania argumentów.

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();
   }
}

Następnie wywołuje obiekt wywołujący FindOccurrences dwa razy. W wywołaniu drugi FindOccurrences, przekazuje obiekt wywołujący null jako ciąg wyszukiwania, które przypadki String.IndexOf(String, Int32) Metoda ArgumentNullException wyjątek. Ten wyjątek jest obsługiwany przez FindOccurrences metody i z powrotem przekazany do obiektu wywołującego. Ponieważ instrukcji throw jest używana z żadne wyrażenie, dane wyjściowe z przykładu pokazuje, że są zachowywane w stosie wywołań.

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()

Natomiast jeśli ponownie wyjątku przy użyciu

throw e

Instrukcja, stos wywołań pełne nie są zachowywane, a przykład wygeneruje następujące dane wyjściowe:

"" występuje w następujących pozycji znaku: 4, 7, 15 Wystąpił wyjątek (argumentnullexception —). Komunikat o błędzie: Wartość nie może mieć wartości null. Nazwa parametru: wartość ślad stosu: w Library.FindOccurrences (s ciągu, ciąg f) w Example.Main()

Nieco bardziej kłopotliwy alternatywą jest nowego wyjątku i zachować informacje stosu wywołań oryginalnego wyjątku w wyjątek wewnętrzny. Obiekt wywołujący można następnie użyć nowy wyjątek InnerException Właściwość do pobrania ramki stosu i inne informacje na temat oryginalnego wyjątku. W tym przypadku instrukcji throw jest:

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

Kod użytkownika, który obsługuje wyjątek ma pamiętać, że InnerException właściwość zawiera informacje dotyczące oryginalnego wyjątku, jak pokazano w poniższej następujące obsługi wyjątków.

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)

Gdy należy zgłosić wyjątek, można jej użyć istniejącego typu wyjątku w programie .NET Framework, a nie Implementowanie niestandardowego wyjątku. Należy użyć typu Standardowy wyjątek tych dwóch warunkach:

  • Są zgłaszać wyjątek, który jest spowodowany przez błąd użycia (oznacza to, że błąd w logiki programu przez dewelopera, który wywołuje metodę). Zazwyczaj należy może zgłosić wyjątek, takich jak ArgumentException, ArgumentNullException, InvalidOperationException, lub NotSupportedException. Ciąg, który można dostarczyć do konstruktora obiektu wyjątek podczas tworzenia wystąpienia obiektu wyjątku powinien opisania błędu, aby deweloper może naprawić. Aby uzyskać więcej informacji, zobacz Message Właściwości.

  • Wystąpił błąd, który być przekazywane do obiektu wywołującego, z wyjątkiem istniejących .NET Framework są obsługi. Należy zgłosić wyjątek najbardziej pochodnego możliwe. Na przykład, jeśli metoda wymaga argumentu w prawidłowym elementem członkowskim typu wyliczeniowego, należy zgłosić InvalidEnumArgumentException (Klasa pochodna najbardziej), a nie ArgumentException.

W poniższej tabeli wymieniono typowe typy wyjątków i warunki, na których będzie zgłaszają je.

Wyjątek

Warunek

ArgumentException

Argument innych niż null, która jest przekazywana do metody jest nieprawidłowy.

ArgumentNullException

To argument, który jest przekazywany do metody null.

ArgumentOutOfRangeException

Argument jest poza zakresem prawidłowych wartości.

DirectoryNotFoundException

Część ścieżki katalogu jest nieprawidłowy.

DivideByZeroException

Mianownik w całkowitą lub Decimal operacji dzielenia wynosi zero.

DriveNotFoundException

Dysk jest niedostępny lub nie istnieje.

FileNotFoundException

Plik nie istnieje.

FormatException

Wartość nie jest w odpowiednim formacie przekonwertować z ciągu za pomocą metody konwersji, takich jak Parse.

IndexOutOfRangeException

Indeks jest poza granicami tablicy lub kolekcji.

InvalidOperationException

Wywołanie metody jest nieprawidłowy w bieżącym stanie obiektu.

KeyNotFoundException

Nie można odnaleźć określonego klucza dostępu do elementu członkowskiego w kolekcji.

NotImplementedException

Metoda lub operacja nie jest zaimplementowana.

NotSupportedException

Metoda lub operacja nie jest obsługiwana.

ObjectDisposedException

Operacja jest wykonywana na obiekt, który został usunięty.

OverflowException

Operacje arytmetyczne, rzutowania lub konwersji operacji powoduje przepełnienie.

PathTooLongException

Nazwa pliku lub ścieżka przekracza maksymalną długość zdefiniowaną przez system.

PlatformNotSupportedException

Operacja nie jest obsługiwana na bieżącej platformie.

RankException

Tablica z nieprawidłową liczbą wymiarów jest przekazywany do metody.

TimeoutException

Interwał czasu przydzielony do operacji wygasł.

UriFormatException

Nieprawidłowy identyfikator (URI) jest używany.

W następujących przypadkach przy użyciu istniejącego wyjątek .NET Framework do obsługi warunek błędu jest nieodpowiedni:

  • Gdy wyjątek odzwierciedla błędu unikatowy program, który nie można zamapować na istniejących wyjątek .NET Framework.

  • Gdy wyjątek wymaga obsługi, który różni się od obsługi odpowiednią dla istniejących wyjątek .NET Framework lub wyjątek musi rozróżniane z podobne wyjątek. Na przykład, jeśli możesz zgłosić ArgumentOutOfRangeException wyjątek podczas analizowania reprezentację liczbową ciąg, który jest poza zakresem typu całkowitego docelowej, czy nie ma być ten sam wyjątek dla błędu ograniczone wyniki z obiekt wywołujący nie podano odpowiednie wartości podczas wywołania metody.

Exception Klasa jest klasą podstawową wszystkich wyjątków w programie .NET Framework. Wiele klas pochodnych polegają na zachowanie dziedziczone elementy członkowskie Exception klasy; nie zastępowały one członków Exception, ani nie zostanie zdefiniowana żadnych unikatowych elementów członkowskich.

Aby zdefiniować klasę wyjątków:

  1. Definiowanie klasy, która dziedziczy z Exception. Jeśli to konieczne, zdefiniuj żadnych unikatowych elementów członkowskich wymagane przez klasy, aby podać dodatkowe informacje o wyjątku. Na przykład ArgumentException zawiera klasy ParamName właściwość, która określa nazwę parametru, którego argument spowodował wyjątek, i RegexMatchTimeoutException zawiera właściwość MatchTimeout właściwość, która wskazuje interwał limitu czasu.

  2. Jeśli to konieczne, zastąpienie wszelkich dziedziczone elementy członkowskie funkcje, których chcesz zmienić lub zmodyfikować. Należy zauważyć, że większość istniejących pochodne klasy Exception nie zastąpić zachowanie dziedziczone elementy członkowskie.

  3. Ustal, czy obiekt niestandardowy wyjątek jest możliwy do serializacji. Serializacja umożliwia zapisanie informacji o wyjątku i pozwala na informacje o wyjątku do udostępnienia przez serwer i klienta serwera proxy w kontekście usług zdalnych. Aby wprowadzić do serializacji obiektu wyjątku, oznacz ją z SerializableAttribute atrybutu.

  4. Definiowanie konstruktora klasy wyjątku. Zazwyczaj klasy wyjątków mają co najmniej jeden z następujących konstruktorów:

    • Exception(), który używa wartości domyślnych zainicjować właściwości nowych obiekt wyjątku.

    • Exception(String), która inicjuje nowy obiekt wyjątku z określonym komunikatem o błędzie.

    • Exception(String, Exception), która inicjuje nowy obiekt wyjątku z wyjątkiem wewnętrzne i komunikat określony błąd.

    • Exception(SerializationInfo, StreamingContext), który jest protected Konstruktor, która inicjuje nowy obiekt wyjątku z serializowane dane. Jeśli wybrano obiekt wyjątku do serializacji, należy zaimplementować tego konstruktora.

W poniższym przykładzie pokazano użycie klasy niestandardowy wyjątek. Definiuje NotPrimeException wyjątek, który jest generowany, gdy klient próbuje pobrać sekwencję liczb pierwszych, określając początkowy numer, który nie jest podstawowym. Wyjątek definiuje nową właściwość NonPrime, która zwraca innych niż pierwsze numer, który spowodował wyjątek. Oprócz wykonania chroniony konstruktor bez parametrów i konstruktora z SerializationInfo i StreamingContext Parametry do serializacji, NotPrimeException Klasa definiuje trzy konstruktory dodatkowe do obsługi NonPrime Właściwości. Każdy Konstruktor wywołuje konstruktora klasy podstawowej, oprócz zachowania programu liczba firmy innej niż pierwsza wartość. NotPrimeException Klasy są również oznaczane SerializableAttribute atrybutu.

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 Klasa pokazano w poniższym przykładzie używa nazwanego sitem Eratostenesa do obliczania sekwencji liczb pierwszych od 2 do limitu określonego przez klienta w wywołaniu jego konstruktora klasy. GetPrimesFrom Metoda zwraca wszystkie liczby pierwsze, które są większe niż lub równe określonym dolną granicę, ale zgłasza NotPrimeException Jeśli tym dolną granicę nie jest liczba pierwsza.

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();
   }
}

Poniższy przykład wykonuje dwa wywołania GetPrimesFrom Metoda z innych niż liczb pierwszych, z których jedna przecięcie granic domeny aplikacji. W obu przypadkach wyjątek jest zgłaszany i pomyślnie obsługiwany w kodzie klienta.

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("--------");
      }
   }
}

W Platforma .NET dla aplikacji do Sklepu Windows 8.x dla Windows 8, niektóre informacje o wyjątku jest zazwyczaj utracone, gdy wyjątek jest propagowany za pośrednictwem ramek stosu - .NET Framework. Począwszy od .NET Framework 4.5.1 i Windows 8.1, będzie nadal używał oryginalne środowisko uruchomieniowe języka wspólnego Exception obiekt, który został zgłoszony, chyba że ten wyjątek został zmodyfikowany w ramce stosu - .NET Framework.

W poniższym przykładzie pokazano catch bloku, który jest zdefiniowany w celu obsługi ArithmeticException błędy. To catch również zablokować połowy DivideByZeroException błędy, ponieważ DivideByZeroException pochodzi od klasy ArithmeticException i ma nie catch jawnie zdefiniowany dla bloku DivideByZeroException błędy.

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()

*/

Platforma uniwersalna systemu Windows
Dostępne od 8
.NET Framework
Dostępne od 1.1
Biblioteka klas przenośnych
Obsługiwane w: przenośne platformy .NET
Silverlight
Dostępne od 2.0
Windows Phone Silverlight
Dostępne od 7.0
Windows Phone
Dostępne od 8.1

Wszystkie publiczne statyczne ( Shared w języku Visual Basic) elementy członkowskie tego typu są wątkowo bezpieczne. Dla żadnych elementów członkowskich wystąpień nie ma gwarancji bezpieczeństwa wątkowego.

Powrót do początku
Pokaż: