Eksportuj (0) Drukuj
Rozwiń wszystko
Ten artykuł był przetłumaczony komputerowo. Oryginalny tekst zobaczysz, umieszczając wskaźnik myszy nad zdaniami w artykule. Więcej informacji.
Tłumaczenie
Oryginał

Klasa Exception

.NET Framework 4.5

Reprezentuje błędy, które występują podczas wykonywania aplikacji.

Przestrzeń nazw:  System
Zestaw:  mscorlib (w mscorlib.dll)

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

Typ Exception uwidacznia następujące elementy członkowskie.

  NazwaOpis
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreException()Inicjuje nowe wystąpienie klasy Exception.
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreException(String)Inicjuje nowe wystąpienie Exception klasy wiadomości określony błąd.
Metoda chronionaException(SerializationInfo, StreamingContext)Inicjuje nowe wystąpienie Exception klasy z serializowane dane.
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreException(String, Exception)Inicjuje nowe wystąpienie Exception klasy określony komunikat i odwołanie do wyjątek wewnętrzny, który jest przyczyną tego wyjątku.
Początek

  NazwaOpis
Właściwość publicznaObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreDataPobiera kolekcja par klucz/wartość, zawierające dodatkowe informacje użytkownika o wyjątku.
Właściwość publicznaObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreHelpLink Pobiera lub ustawia łącze do pliku pomocy skojarzonego z tym wyjątkiem.
Właściwość publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreHResult Pobiera lub ustawia zakodowaną wartość liczbową HRESULT, przypisaną do określonych wyjątków.
Właściwość publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreInnerException Pobiera instancję Exception, która spowodowała bieżący wyjątek.
Właściwość publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreMessagePobiera komunikat, który opisuje bieżący wyjątek.
Właściwość publicznaObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreSourcePobiera lub ustawia nazwę aplikacji lub obiektu, który powoduje błąd.
Właściwość publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreStackTracePobiera reprezentację ciąg natychmiastowego ramek na stosie wywołań.
Właściwość publicznaTargetSite Pobiera metodę, która wygenerowała bieżący wyjątek.
Początek

  NazwaOpis
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreEquals(Object) Określa, czy określony obiekt jest równy bieżącemu obiektowi. (Odziedziczone z Object).
Metoda chronionaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreFinalize Pozwala, aby obiekt spróbował zwolnić zasoby i wykonał inne operacje czyszczenia, zanim zostanie odzyskany przez moduł zbierający elementy bezużyteczne. (Odziedziczone z Object).
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreGetBaseExceptionZwraca wartość po zastąpieniu w klasie pochodnej, Exception oznacza to przyczyną jednego lub więcej kolejnych wyjątków.
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreGetHashCode Służy jako domyślna funkcja skrótu. (Odziedziczone z Object).
Metoda publicznaGetObjectDataPo zastąpieniu w klasie pochodnej, ustawia SerializationInfo z informacji o wyjątku.
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreGetTypePobiera typ runtime bieżącego wystąpienia.

W programie XNA Framework 3.0 ten element członkowski jest dziedziczony z metody Object.GetType().


W programie Portable Class Library Portable Class Library ten element członkowski jest dziedziczony z metody Object.GetType().


W programie .NET dla aplikacji do sklepu Windows Store Windows 8 ten element członkowski jest dziedziczony z metody Object.GetType().
Metoda chronionaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreMemberwiseClone Tworzy płytką kopię bieżącego obiektu Object. (Odziedziczone z Object).
Metoda publicznaObsługiwane przez program XNA FrameworkObsługiwane przez program Portable Class LibraryObsługiwane w .NET dla aplikacji do sklepu Windows StoreToString Tworzy i zwraca reprezentację tekstową bieżącego wyjątku. (Zastępuje Object.ToString()).
Początek

  NazwaOpis
Zdarzenie chronioneSerializeObjectStateWystępuje, gdy wyjątek jest seryjny utworzyć obiekt Państwo wyjątek, który zawiera serializowany danych o wyjątku.
Początek

Ta klasa jest klasą bazową dla wszystkich wyjątków. Gdy wystąpi błąd, system lub aplikacja aktualnie wykonywanie raportów go przez Zgłaszanie wyjątku, który zawiera informacje o błędzie. Po wyjątek, jest to obsługiwane przez aplikację lub przez domyślnym programem 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
Wybieranie standardowych wyjątków
Implementowanie wyjątków niestandardowych

Błędy i wyjątki

Błędy wykonania mogą występować różnych powodów. Jednak nie wszystkie błędy powinny być traktowane jako wyjątki w kodzie. Poniżej przedstawiono niektóre kategorie błędów, które mogą wystąpić w czasie wykonywania i odpowiednie sposoby na nie zareagować.

  • Błędy użycia. Błąd użycia reprezentuje błąd w logice program, który może spowodować wyjątek. Jednak ten błąd należy zająć się nie poprzez obsługi wyjątków, ale przez zmodyfikowanie kodu wadliwy. Na przykład, zastępująca Object.Equals(Object) metoda w poniższym przykładzie założono, że obj argument musi zawsze być niezerowe.

    
    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óra powstaje po obj jest null można wyeliminować poprzez zmianę kodu źródłowego do testowania jawnie null przed wywołaniem funkcji Object.Equals override i ponowną kompilację. Poniższy przykład zawiera kod źródłowy skorygowana, który obsługuje null argument.

    
    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 metoda do użycia w wykrywaniu błędów kompilacji debugowania i Trace.Assert buduje metody do użycia w wykrywaniu błędów dotyczących zarówno debug i release. Aby uzyskać więcej informacji, zobacz Potwierdzenia w zarządzanym kodzie.

  • Błędy programu. Błąd programu jest błąd w czasie wykonywania, które niekoniecznie nie można uniknąć poprzez napisanie kodu wolny od błędów.

    W niektórych przypadkach błąd programu może odzwierciedlać warunek błędu oczekiwanego lub rutynowych. W takim przypadku można unikać obsługi wyjątków do czynienia z powodu błędu program i zamiast ponów operację. Na przykład, jeśli użytkownik powinien wprowadzić daty w określonym formacie, można przeanalizować ciągu daty, wywołując DateTime.TryParseExact metoda, która zwraca Boolean wartość wskazująca, czy analizy operacja zakończyła się pomyślnie, a nie za pomocą DateTime.ParseExact metoda, która wyrzuca FormatException wyjątek, jeśli nie można przekonwertować ciągu daty DateTime wartości. Podobnie, jeśli użytkownik próbuje otworzyć plik, który nie istnieje, można wywołać File.Exists , aby sprawdzić, czy plik istnieje i, jeżeli tak się nie Monituj użytkownika czy on lub ona chce go utworzyć.

    W innych przypadkach błąd programu odzwierciedla nieoczekiwany błąd, który może odbywać się w kodzie. Na przykład nawet jeśli została sprawdzona, upewnij się, że plik istnieje, to mogą zostać usunięte zanim można go otworzyć, lub może być uszkodzony. W takim przypadku spróbuj ponownie otworzyć plik przez utworzenie wystąpienia StreamReader obiektu lub telefonicznej Open metoda może generować FileNotFoundException wyjątek. W takich przypadkach należy użyć do odzyskania z błędów obsługi wyjątków.

  • Awarie systemu. Awaria systemu jest błąd w czasie wykonywania, który nie może zostać obsłużone programowo, w znaczący sposób. Na przykład można rzucić dowolną metodę OutOfMemoryException wyjątek, jeśli common language runtime nie może przydzielić dodatkową pamięć. Zwykle 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, aby rejestrować informacje o wyjątku i powiadamia użytkownika o awarii, zanim zakończy aplikacji.

Bloki try/catch

Common language runtime udostępnia model obsługi wyjątku, który jest oparty na przedstawienie wyjątki jako obiekty i oddzielenie kodu programu oraz kodu do obsługi wyjątków try bloków i catch bloków. Może być jeden lub więcej catch bloki, każdy przeznaczony do obsługi określonego typu wyjątku lub jeden blok przeznaczony do połowu wyjątek bardziej szczegółowych 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 nazywa się try bloku. Kod aplikacji, która obsługuje wyjątki generowane przez try bloku jest umieszczana w catch instrukcji i nazywa się catch bloku. Zero lub więcej catch bloki są związane z try blok, a każdy catch bloku zawiera typ filtru, który określa typy obsługi wyjątków.

Kiedy wystąpi wyjątek w try blok, system szuka związanych z nimi catch bloki w kolejności występują w kodzie aplikacji, dopóki go nie znajdzie catch blok, która obsługuje wyjątek. A catch bloku obsługuje wyjątek typu T Jeśli Określa filtr typu blok catch T lub dowolny typ, które T pochodzi od. System zatrzymuje wyszukiwanie po znajdzie pierwszy catch blok, która obsługuje wyjątek. Z tego powodu w kodzie aplikacji catch blok, która obsługuje typ musi być określony przed catch blok, która obsługuje jego typów podstawowych, jak pokazano w następującym przykładzie tej sekcji. Blok catch, która obsługuje System.Exception został ostatnio określony.

Jeśli żadna z catch bloków skojarzone z bieżącym try bloku obsługi wyjątków i bieżące try bloku jest zagnieżdżony w granicach drugiej try bloki w bieżącej rozmowy, catch bloki z następnym otaczający try bloku są przeszukiwane. Jeśli nie catch znajduje się blok wyjątku, system stara poprzednich poziomów zagnieżdżenia w bieżącej rozmowy. Jeśli nie catch zablokować dla wyjątku znajduje się w bieżącej rozmowy, wyjątek jest kierowany stos wywołań i poprzedniej ramki stosu jest wyszukiwany catch blok, która obsługuje wyjątek. Wyszukiwanie stosu wywołań jest kontynuowane aż do obsługi wyjątku lub ma więcej ramek istnieje na stos wywołań. Jeżeli na górze stosu wywołań zostanie osiągnięta bez ustalenia catch blok, która obsługuje wyjątek, wyjątek domyślnym programem obsługi obsługuje go i zakończeniu działania aplikacji.

Funkcje typu wyjątku

Wyjątek typów obsługuje następujące funkcje:

  • Tekst czytelny dla człowieka, który opisuje błąd. Gdy wystąpi wyjątek, środowiska wykonawczego sprawia, że SMS dostępny informować użytkownika o rodzaju błędu i zaproponować działania do rozwiązania problemu. Ten tekst wiadomości odbywa się w Message właściwość obiektu wyjątek. Podczas tworzenia obiektu wyjątek do konstruktora opisać szczegóły tego wyjątku określonego można przekazać ciąg tekstowy. Jeśli żaden argument komunikat błędu jest podany do konstruktora, używany jest domyślny komunikat o błędzie. Aby uzyskać więcej informacji, zobacz omówienie właściwości Message.

  • Stan stos wywołań, gdy wystąpił wyjątek. StackTrace Właściwość niesie ze sobą ślad stosu, który może służyć do określenia, w którym występuje błąd w kodzie. Ślad stosu Wyświetla wywołanych metod i numerów wierszy w pliku źródłowym, gdzie wywołań.

Właściwości klasy wyjątku

Exception Klasa zawiera szereg właściwości, które ułatwiają identyfikację kodu lokalizacji, typ, plik pomocy i przyczynę wyjątek: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, i Data.

Gdy istnieje związek przyczynowy między dwoma lub więcej wyjątków, InnerException właściwość przechowuje te informacje. Wyjątek zewnętrzny jest generowany w odpowiedzi na ten wyjątek wewnętrzny. Kod, który obsługuje dany wyjątek zewnętrzny można użyć informacji z wcześniej wewnętrzny wyjątek do właściwiej obsługi błędu. Dodatkowe informacje o wyjątku mogą być przechowywane jako zbiór pary klucz/wartość w Data właściwości.

Komunikat błędu, który jest przekazywany do konstruktora podczas tworzenia obiektu wyjątek powinny być zlokalizowane i mogą być dostarczane z pliku zasobów za pomocą ResourceManager klasy. Aby uzyskać więcej informacji dotyczących zlokalizowanych zasobów, zobacz Tworzenie zestawów satelickich dla aplikacji klasycznych i Opakowanie i wdrażanie zasobów w aplikacjach klasycznych tematy.

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

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

Aby uzyskać listę wartości początkowe właściwość wystąpienie z Exception klasy, zobacz Exception konstruktorów.

Zagadnienia dotyczące wydajności

Rzucanie lub Obsługa wyjątku zużywa znaczną ilość zasobów systemowych i czasu wykonywania. Generują wyjątki tylko do obsługi prawdziwie nadzwyczajnych warunków nie do obsługi zdarzeń przewidywalne lub Sterowanie przepływem. Na przykład w niektórych przypadkach, na przykład kiedy projektujesz Biblioteka klas, to uzasadnione jest wyjątek, jeśli argument metoda jest nieprawidłowa, ponieważ można oczekiwać Twój metoda się nazywać z prawidłowych parametrów. Metoda nieprawidłowy argument, jeśli nie jest wynikiem błędów użycia, oznacza, że nastąpiło coś nadzwyczajnego. I odwrotnie nie wyjątek, jeśli dane wprowadzone przez użytkownika jest nieprawidłowa, ponieważ można oczekiwać, że użytkownicy mają wprowadzać czasami nieprawidłowe dane. Zamiast tego należy podać mechanizm ponów próbę, aby użytkownicy mogli wprowadzać prawidłowych danych wejściowych. Nie należy używać wyjątki do obsługi błędów użycia. Zamiast tego należy użyć twierdzenia do identyfikowania i poprawić błędy użycia.

Ponadto nie zgłosiła wyjątku, gdy kod zwrotny jest wystarczające; nie wolno konwertować zwrócony kod wyjątku; i czy nie jest rutynowo połowu wyjątek, Ignoruj to i następnie kontynuować przetwarzanie.

Wybieranie standardowych wyjątków

Gdy musisz zgłosić wyjątek, często służy istniejącego typu wyjątku w.NET Framework zamiast wdrażać niestandardowe wyjątek. Należy użyć typu standardowych wyjątek pod te dwa warunki:

  • Wyjątek, który jest spowodowane przez błąd użycia są przerzucane (czyli błąd w logika programu przez dewelopera, który wywołuje metodę). Zazwyczaj można będzie wyjątek, takich jak ArgumentException, ArgumentNullException, InvalidOperationException, lub NotSupportedException. Ciąg, który zostanie podana do konstruktora obiektu wyjątek podczas tworzenia instancji obiektu wyjątek powinna zawierać opis błędu tak, że można naprawić przez autora. Aby uzyskać więcej informacji, zobacz omówienie właściwości Message.

  • Błąd, który może być przekazywana do obiektu wywołującego z istniejącym wyłączeniem.NET Framework są obsługi. Powinien zgłosić wyjątek najbardziej pochodnej możliwe. Na przykład, jeśli metoda wymaga argumentu być prawidłowym członkiem typ wyliczenia, powinien zgłosić InvalidEnumArgumentException (klasa pochodzi najbardziej), a nie ArgumentException.

Implementowanie wyjątków niestandardowych

Przy użyciu istniejącego wyjątek.NET Framework do obsługi warunek błędu nie jest w następujących przypadkach odpowiednie:

  • Kiedy wyjątek odzwierciedla błąd unikalny program, który nie mogą być mapowane do istniejących wyjątek.NET Framework.

  • Kiedy wyjątek wymaga obsługi, który różni się od czynności, których właściwe dla istniejących wyjątek.NET Framework lub wyjątek musi być sobie z podobnych wyjątku. Na przykład, jeśli rzut ArgumentOutOfRangeException wyjątek podczas analizowania numeryczną reprezentację ciągu, który jest spoza zakresu typu docelowego integralną, nie chcesz używać tego samego wyjątku dla błąd, który ograniczone wyniki od rozmówcy nie dostarcza odpowiednie wartości podczas wywołania metody.

Exception Klasa jest klasą bazową dla wszystkich wyjątków w.NET Framework. Wiele klas pochodnych polegać na zachowanie dziedziczonych członków Exception klasy; nie zastępują członków Exception, ani nie zostanie zdefiniowana żadnych unikatowych elementów członkowskich.

Aby zdefiniować własne klasa wyjątków:

  1. Zdefiniowanie klasy, która dziedziczy z Exception. Jeśli to konieczne, należy zdefiniować wszystkie unikatowe składniki wymagane przez klasę dodatkowe informacje o wyjątku. Na przykład ArgumentException klasa obejmuje ParamName właściwość, która określa nazwę parametru, w których 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ępować żadnych członków dziedziczonych funkcje, których chcesz zmienić lub zmodyfikować. Należy zauważyć, że większość istniejących klasy z pochodne Exception nie zastępują zachowanie członków dziedziczonych.

  3. Określić, 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 obiekt wyjątku do serializacji, oznaczyć ją z SerializableAttribute atrybut.

  4. Zdefiniuj Konstruktory klasy wyjątek. Zazwyczaj klas wyjątków mają jeden lub więcej następujących konstruktory:

    • Exception() , który używa wartości domyślnych do zainicjowania właściwości nowego obiektu wyjątek.

    • Exception(String) , który inicjuje obiekt wyjątku z określonego błędu.

    • Exception(String, Exception) , który inicjuje obiekt wyjątku z wiadomości i wewnętrzny wyjątek określony błąd.

    • Exception(SerializationInfo, StreamingContext) , który jest protected konstruktora, który inicjuje obiekt wyjątku od serializowany danych. Ten konstruktor należy implementować, jeśli wybrano do obiektu wyjątek do serializacji.

Poniższy przykład ilustruje użycie klasy niestandardowe wyjątek. Definiuje on NotPrimeException wyjątek, który jest generowany, gdy klient próbuje pobrać sekwencji liczb pierwszych, określając numer początkowy, który nie jest głównym. Wyjątek definiuje nową właściwość, NonPrime, która zwraca non-prime numer, który spowodował wyjątek. Oprócz wykonania chronionych konstruktora bez parametrów i konstruktora z SerializationInfo i StreamingContext parametry do serializacji, NotPrimeException klasa definiuje trzy dodatkowe konstruktorów do obsługi NonPrime właściwości. Konstruktor każdego wywołania konstruktora klasy podstawowej, oprócz zachowania wartości z non liczba pierwsza. NotPrimeException Klasy jest również oznaczony z SerializableAttribute atrybut.


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 Klasy pokazano w poniższym przykładzie używa sito Eratostenes do obliczania sekwencji liczb pierwszych od 2 do limit określony przez klienta do wywołania do jego konstruktora klasy. GetPrimesFrom Metoda zwraca wszystkich liczb, które są większe niż lub równe określonej granicy dolnej, ale wyrzuca NotPrimeException Jeśli tym dolną granicę nie jest liczbą pierwszą.


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 powoduje, że dwóch połączeń do GetPrimesFrom metoda z non liczby pierwsze, z których jedna przecina granic domen aplikacji. W obu przypadkach wyjątku jest generowany i pomyślnie obsługiwane kod 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("--------");
      }
   }
}


Program obsługi Windows i.NET Framework 4.5.1

W .NET dla aplikacji do sklepu Windows Store dla Windows 8, niektóre informacje o wyjątku jest zazwyczaj utracone, gdy wyjątek jest rozpowszechnianymi przy użyciu ramek stosu non -.NET Framework. Począwszy od .NET Framework 4.5.1 i Windows 8.1, aparatu plików wykonywalnych języka wspólnego w dalszym ciągu używać oryginał Exception obiekt, który został zgłoszony, chyba że ten wyjątek został zmodyfikowany w ramce stosu non -.NET Framework.

W poniższym przykładzie zademonstrowano catch bloku, który jest zdefiniowany w celu obsługi ArithmeticException błędy. To catch również zablokować połowów DivideByZeroException błędy, ponieważ DivideByZeroException wynika z ArithmeticException i ma nie catch jawnie określony 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()

*/


.NET Framework

Obsługiwane w: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Obsługiwane w: 4, 3.5 z dodatkiem SP1

Portable Class Library

Obsługiwane w: Portable Class Library

.NET dla aplikacji do sklepu Windows Store

Obsługiwane w: Windows 8

.NET dla aplikacji dla Windows Phone

Obsługiwane w: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 z dodatkiem R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista z dodatkiem SP2, Windows Server 2008 (instalacja roli Server Core jest nieobsługiwana), Windows Server 2008 R2 (instalacja roli Server Core jest obsługiwana, gdy jest zainstalowany dodatek SP1 lub nowszy; procesory Itanium nie są obsługiwane)

Program .NET Framework nie obsługuje wszystkich wersji każdej platformy. Aby uzyskać listę wszystkich obsługiwanych wersji, zobacz Wymagania systemowe programu .NET Framework.

Wszystkie publiczne static (Shared w języku Visual Basic) elementy członkowskie tego typu są bezpieczne dla wątków. Wystąpienia elementów członkowskich nie dają gwarancji bezpieczeństwa wątków.

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

Zawartość społeczności

Dodaj
Pokaż:
© 2014 Microsoft