Exception Sınıf

Tanım

Uygulama yürütme sırasında oluşan hataları temsil eder.Represents errors that occur during application execution.

public ref class Exception
public ref class Exception : System::Runtime::Serialization::ISerializable
public ref class Exception : System::Runtime::InteropServices::_Exception, System::Runtime::Serialization::ISerializable
public class Exception
public class Exception : System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public class Exception : System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public class Exception : System.Runtime.InteropServices._Exception, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public class Exception : System.Runtime.Serialization.ISerializable
type Exception = class
type Exception = class
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Exception = class
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Exception = class
    interface ISerializable
    interface _Exception
[<System.Serializable>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Exception = class
    interface ISerializable
Public Class Exception
Public Class Exception
Implements ISerializable
Public Class Exception
Implements _Exception, ISerializable
Devralma
Exception
Türetilmiş
Öznitelikler
Uygulamalar

Örnekler

Aşağıdaki örnek, catch hataları işlemek için tanımlanan bir bloğu gösterir ArithmeticException .The following example demonstrates a catch block that is defined to handle ArithmeticException errors. Bu catch blok DivideByZeroException , DivideByZeroException öğesinden türetildiğinden ArithmeticException ve catch açıkça hatalar için tanımlı bir blok bulunmadığından hataları yakalar DivideByZeroException .This catch block also catches DivideByZeroException errors, because DivideByZeroException derives from ArithmeticException and there is no catch block explicitly defined for DivideByZeroException errors.

using namespace System;
int main()
{
    int x = 0;
    try
    {
        int y = 100 / x;
    }
    catch ( ArithmeticException^ e ) 
    {
        Console::WriteLine( "ArithmeticException Handler: {0}", e );
    }
    catch ( Exception^ e ) 
    {
        Console::WriteLine( "Generic Exception Handler: {0}", e );
    }
}
/*
This code example produces the following results:

ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero.
   at main()
 
*/
using System;

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

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

*/
Class ExceptionTestClass
   
   Public Shared Sub Main()
      Dim x As Integer = 0
      Try
         Dim y As Integer = 100 / x
      Catch e As ArithmeticException
         Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())
      Catch e As Exception
         Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
      End Try
   End Sub
End Class
'
'This code example produces the following results:
'
'ArithmeticException Handler: System.OverflowException: Arithmetic operation resulted in an overflow.
'   at ExceptionTestClass.Main()
'

Açıklamalar

Bu sınıf tüm özel durumlar için temel sınıftır.This class is the base class for all exceptions. Bir hata oluştuğunda, sistem veya şu anda yürütülmekte olan uygulama, hata hakkında bilgi içeren bir özel durum oluşturarak onu rapor edebilir.When an error occurs, either the system or the currently executing application reports it by throwing an exception that contains information about the error. Bir özel durum oluşturulduktan sonra, uygulama veya varsayılan özel durum işleyicisi tarafından işlenir.After an exception is thrown, it is handled by the application or by the default exception handler.

Bu bölümdeki konular:In this section:

Hatalar ve özel durumlar Errors and exceptions
Try/catch blokları Try/catch blocks
Özel durum türü özellikleri Exception type features
Özel durum sınıfı özellikleri Exception class properties
Performans konuları Performance considerations
Özel durum yeniden oluşturuluyor Re-throwing an exception
Standart özel durumlar seçme Choosing standard exceptions
Özel durum uygulamaImplementing custom exceptions

Hatalar ve özel durumlarErrors and exceptions

Çeşitli nedenlerden dolayı çalışma zamanı hataları oluşabilir.Run-time errors can occur for a variety of reasons. Ancak, tüm hatalar kodunuzda özel durumlar olarak işlenmemelidir.However, not all errors should be handled as exceptions in your code. İşte, çalışma zamanında oluşabilecek bazı hata kategorileri ve bunlara yanıt vermek için uygun yollar aşağıda verilmiştir.Here are some categories of errors that can occur at run time and the appropriate ways to respond to them.

  • Kullanım hataları.Usage errors. Kullanım hatası, program mantığındaki bir özel durumla sonuçlanamayan bir hatayı gösterir.A usage error represents an error in program logic that can result in an exception. Ancak hata, özel durum işleme aracılığıyla değil, hatalı kodu değiştirerek ele alınmalıdır.However, the error should be addressed not through exception handling but by modifying the faulty code. Örneğin, Object.Equals(Object) Aşağıdaki örnekteki yönteminin geçersiz kılınması, obj bağımsız değişkenin her zaman null olmayan bir değer olması gerektiğini varsayar.For example, the override of the Object.Equals(Object) method in the following example assumes that the obj argument must always be non-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));
       }
    }
    
    Public Class Person
       Private _name As String
       
       Public Property Name As String
          Get
             Return _name
          End Get
          Set
             _name = value
          End Set
       End Property
       
       Public Overrides Function Equals(obj As Object) As Boolean
          ' This implementation contains an error in program logic:
          ' It assumes that the obj argument is not null.
          Dim p As Person = CType(obj, Person)
          Return Me.Name.Equals(p.Name)
       End Function
    End Class
    
    Module Example
       Public Sub Main()
          Dim p1 As New Person()
          p1.Name = "John"
          Dim p2 As Person = Nothing
          
          ' The following throws a NullReferenceException.
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2))   
       End Sub
    End Module
    

    NullReferenceExceptionZaman obj , null geçersiz kılma çağrılmadan önce null için açıkça test etmek Object.Equals ve sonra yeniden derlemek için kaynak kodu değiştirilerek bu durum ortadan kaldırılabilir.The NullReferenceException exception that results when obj is null can be eliminated by modifying the source code to explicitly test for null before calling the Object.Equals override and then re-compiling. Aşağıdaki örnek, bir bağımsız değişkeni işleyen düzeltilmiş kaynak kodunu içerir null .The following example contains the corrected source code that handles a 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
    
    Public Class Person
       Private _name As String
       
       Public Property Name As String
          Get
             Return _name
          End Get
          Set
             _name = value
          End Set
       End Property
       
       Public Overrides Function Equals(obj As Object) As Boolean
          ' This implementation handles a null obj argument.
          Dim p As Person = TryCast(obj, Person)
          If p Is Nothing Then 
             Return False
          Else
             Return Me.Name.Equals(p.Name)
          End If
       End Function
    End Class
    
    Module Example
       Public Sub Main()
          Dim p1 As New Person()
          p1.Name = "John"
          Dim p2 As Person = Nothing
          
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2))   
       End Sub
    End Module
    ' The example displays the following output:
    '       p1 = p2: False
    

    Kullanım hataları için özel durum işlemeyi kullanmak yerine, Debug.Assert hata ayıklama Derlemeleriyle ilgili kullanım hatalarını belirlemek için yöntemini ve Trace.Assert hem hata ayıklama hem de sürüm yapılarında kullanım hatalarını belirlemek için yöntemini kullanabilirsiniz.Instead of using exception handling for usage errors, you can use the Debug.Assert method to identify usage errors in debug builds, and the Trace.Assert method to identify usage errors in both debug and release builds. Daha fazla bilgi için bkz. Yönetilen koddaki Onaylamalar.For more information, see Assertions in Managed Code.

  • Program hataları.Program errors. Program hatası, hata içermeyen kod yazılarak önlenemez olması gerekmeyen bir çalışma zamanı hatasıdır.A program error is a run-time error that cannot necessarily be avoided by writing bug-free code.

    Bazı durumlarda, bir program hatası beklenen veya rutin bir hata koşulunu yansıtabilir.In some cases, a program error may reflect an expected or routine error condition. Bu durumda, program hatasıyla başa çıkmak için özel durum işleme kullanmaktan kaçınmak isteyebilirsiniz, bunun yerine işlemi yeniden deneyin.In this case, you may want to avoid using exception handling to deal with the program error and instead retry the operation. Örneğin, kullanıcının belirli bir biçimde bir tarih girmesinin bekleniyorsa, yöntemini çağırarak, Tarih DateTime.TryParseExact Boolean DateTime.ParseExact FormatException dizesinin bir değere dönüştürülemediği durumlarda bir özel durum oluşturan yöntemini kullanarak, tarih dizesini ayrıştırın ve yöntemi bir değer döndürür DateTime .For example, if the user is expected to input a date in a particular format, you can parse the date string by calling the DateTime.TryParseExact method, which returns a Boolean value that indicates whether the parse operation succeeded, instead of using the DateTime.ParseExact method, which throws a FormatException exception if the date string cannot be converted to a DateTime value. Benzer şekilde, bir kullanıcı var olmayan bir dosyayı açmayı denediğinde, önce File.Exists dosyanın mevcut olup olmadığını denetlemek için yöntemini çağırabilir, yoksa, bunu oluşturmak isteyip istemediğini kullanıcıya sorar.Similarly, if a user tries to open a file that does not exist, you can first call the File.Exists method to check whether the file exists and, if it does not, prompt the user whether he or she wants to create it.

    Diğer durumlarda, bir program hatası kodunuzda işlenebilecek beklenmedik bir hata koşulunu yansıtır.In other cases, a program error reflects an unexpected error condition that can be handled in your code. Örneğin, bir dosyanın var olduğundan emin olmak için kontrol etseniz bile, onu açmadan önce silinebilir veya bozulmuş olabilir.For example, even if you've checked to ensure that a file exists, it may be deleted before you can open it, or it may be corrupted. Bu durumda, bir nesneyi örnekleyerek StreamReader veya yöntemini çağırarak dosyayı açmaya çalışmak Open bir FileNotFoundException özel durum oluşturabilir.In that case, trying to open the file by instantiating a StreamReader object or calling the Open method may throw a FileNotFoundException exception. Bu durumlarda, hatadan kurtulmak için özel durum işlemeyi kullanmanız gerekir.In these cases, you should use exception handling to recover from the error.

  • Sistem sorunları.System failures. Sistem hatası, programlama yoluyla anlamlı bir şekilde işlenemeyebilir bir çalışma zamanı hatasıdır.A system failure is a run-time error that cannot be handled programmatically in a meaningful way. Örneğin, OutOfMemoryException ortak dil çalışma zamanı ek bellek ayıramadığında herhangi bir yöntem bir özel durum oluşturabilir.For example, any method can throw an OutOfMemoryException exception if the common language runtime is unable to allocate additional memory. Normalde, sistem arızaları özel durum işleme kullanılarak işlenmez.Ordinarily, system failures are not handled by using exception handling. Bunun yerine, gibi bir olay kullanabilir AppDomain.UnhandledException ve Environment.FailFast özel durum bilgilerini günlüğe kaydetmek ve uygulama sonlandırılmadan önce başarısız olan kullanıcıyı bilgilendirmek için yöntemini çağırabilirsiniz.Instead, you may be able to use an event such as AppDomain.UnhandledException and call the Environment.FailFast method to log exception information and notify the user of the failure before the application terminates.

Try/catch bloğuTry/catch blocks

Ortak dil çalışma zamanı, özel durumların nesne olarak gösterimine ve program kodunun ve özel durum işleme kodunun try bloklara ve bloklara ayrılmasını temel alan bir özel durum işleme modeli sağlar catch .The common language runtime provides an exception handling model that is based on the representation of exceptions as objects, and the separation of program code and exception handling code into try blocks and catch blocks. Bir veya daha fazla blok olabilir catch , her biri belirli bir özel durum türünü işlemek üzere tasarlanır veya başka bir bloktan daha özel bir özel durum yakalamak için tasarlanan bir blok olabilir.There can be one or more catch blocks, each designed to handle a particular type of exception, or one block designed to catch a more specific exception than another block.

Bir uygulama, bir uygulama kodu bloğunun yürütülmesi sırasında oluşan özel durumları işlediğinde, kod bir try ifadeye yerleştirilmelidir ve bir blok olarak adlandırılır try .If an application handles exceptions that occur during the execution of a block of application code, the code must be placed within a try statement and is called a try block. Bir blok tarafından oluşturulan özel durumları işleyen uygulama kodu try bir catch ifadeye yerleştirilir ve bir blok olarak adlandırılır catch .Application code that handles exceptions thrown by a try block is placed within a catch statement and is called a catch block. Sıfır veya daha fazla catch blok bir blok ile ilişkilendirilir try ve her bir catch blok, işlediği özel durumların türlerini belirleyen bir tür filtresi içerir.Zero or more catch blocks are associated with a try block, and each catch block includes a type filter that determines the types of exceptions it handles.

Bir blokta özel durum oluştuğunda try , sistem catch özel durumu işleyen bir blok bulana kadar ilişkili blokları uygulama kodunda göründükleri sırada arar catch .When an exception occurs in a try block, the system searches the associated catch blocks in the order they appear in application code, until it locates a catch block that handles the exception. Bir catch blok T , catch bloğunun tür filtresi, ' T den türetilen herhangi bir tür veya belirtiyorsa, türünde bir özel durum işler T .A catch block handles an exception of type T if the type filter of the catch block specifies T or any type that T derives from. Sistem, özel durumu işleyen ilk bloğu bulduktan sonra aramayı durduruyor catch .The system stops searching after it finds the first catch block that handles the exception. Bu nedenle, uygulama kodunda, catch catch Bu bölümü izleyen örnekte gösterildiği gibi, bir türü işleyen bir blok temel türlerini işleyen bir bloğun önüne belirtilmelidir.For this reason, in application code, a catch block that handles a type must be specified before a catch block that handles its base types, as demonstrated in the example that follows this section. En son belirtilen tanıtıcı bir catch bloğu System.Exception .A catch block that handles System.Exception is specified last.

catchGeçerli bloğuyla ilişkili blokların hiçbiri try özel durumu işleirse ve geçerli try blok try geçerli çağrıda diğer bloklara iç içe geçmişse, catch sonraki kapsayan bloğa ilişkin bloklar try aranır.If none of the catch blocks associated with the current try block handle the exception, and the current try block is nested within other try blocks in the current call, the catch blocks associated with the next enclosing try block are searched. catchÖzel durum için hiçbir blok bulunamazsa, sistem geçerli çağrıda yer aldığı önceki iç içe düzeyleri arar.If no catch block for the exception is found, the system searches previous nesting levels in the current call. catchGeçerli çağrıda özel durum için herhangi bir blok bulunamazsa, özel durum çağrı yığınına geçirilir ve önceki yığın çerçevesi catch özel durumu işleyen bir blok için aranır.If no catch block for the exception is found in the current call, the exception is passed up the call stack, and the previous stack frame is searched for a catch block that handles the exception. Çağrı yığınında arama işlemi, özel durum işlenene veya çağrı yığınında daha fazla çerçeve bulunmadığından devam eder.The search of the call stack continues until the exception is handled or until no more frames exist on the call stack. Özel durumu işleyen bir blok bulmadan çağrı yığınının üst sınırına ulaşılırsa catch , varsayılan özel durum işleyicisi onu işler ve uygulama sonlanır.If the top of the call stack is reached without finding a catch block that handles the exception, the default exception handler handles it and the application terminates.

Özel durum türü özellikleriException type features

Özel durum türleri aşağıdaki özellikleri destekler:Exception types support the following features:

  • Hatayı açıklayan, insan tarafından okunabilen metin.Human-readable text that describes the error. Bir özel durum oluştuğunda, çalışma zamanı kullanıcıya hatanın doğasını bildirmek ve sorunu çözmek için eylem önermek üzere bir SMS mesajı sağlar.When an exception occurs, the runtime makes a text message available to inform the user of the nature of the error and to suggest action to resolve the problem. Bu kısa mesaj, Message özel durum nesnesinin özelliğinde tutulur.This text message is held in the Message property of the exception object. Özel durum nesnesinin oluşturulması sırasında, belirli bir özel durumun ayrıntılarını anlatmak için oluşturucuya bir metin dizesi geçirebilirsiniz.During the creation of the exception object, you can pass a text string to the constructor to describe the details of that particular exception. Oluşturucuya bir hata iletisi bağımsız değişkeni sağlanmazsa, varsayılan hata iletisi kullanılır.If no error message argument is supplied to the constructor, the default error message is used. Daha fazla bilgi için bkz Message . özelliği.For more information, see the Message property.

  • Özel durum oluştuğunda çağrı yığınının durumu.The state of the call stack when the exception was thrown. StackTraceÖzelliği, kodda hatanın nerede oluştuğunu belirlemede kullanılabilecek bir yığın izlemesi taşır.The StackTrace property carries a stack trace that can be used to determine where the error occurs in the code. Yığın izlemesi, çağrılan tüm yöntemleri ve kaynak dosyadaki satır numaralarını, Çağrının yapıldığı yerde listeler.The stack trace lists all the called methods and the line numbers in the source file where the calls are made.

Özel durum sınıfı özellikleriException class properties

ExceptionSınıfı, kod konumunu, türünü, yardım dosyasını ve özel durumun nedenini (,,,,, StackTrace InnerException Message HelpLink HResult Source , TargetSite ve Data ) belirlemenize yardımcı olan birçok özellik içerir.The Exception class includes a number of properties that help identify the code location, the type, the help file, and the reason for the exception: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, and Data.

İki veya daha fazla özel durum arasında bir causal ilişkisi mevcut olduğunda, InnerException özelliği bu bilgileri saklar.When a causal relationship exists between two or more exceptions, the InnerException property maintains this information. Bu iç özel duruma yanıt olarak dış özel durum oluşturuldu.The outer exception is thrown in response to this inner exception. Dış özel durumu işleyen kod, daha önce hatayı daha uygun şekilde işlemek için önceki iç özel durumdan gelen bilgileri kullanabilir.The code that handles the outer exception can use the information from the earlier inner exception to handle the error more appropriately. Özel durumla ilgili ek bilgiler, özelliğindeki anahtar/değer çiftleri koleksiyonu olarak depolanabilir Data .Supplementary information about the exception can be stored as a collection of key/value pairs in the Data property.

Özel durum nesnesinin oluşturulması sırasında oluşturucuya geçirilen hata iletisi dizesi yerelleştirilmesi gerekir ve sınıfı kullanılarak bir kaynak dosyasından sağlanabilir ResourceManager .The error message string that is passed to the constructor during the creation of the exception object should be localized and can be supplied from a resource file by using the ResourceManager class. Yerelleştirilmiş kaynaklar hakkında daha fazla bilgi için bkz. uydu derlemeleri oluşturma ve kaynak paketleme ve dağıtma konuları.For more information about localized resources, see the Creating Satellite Assemblies and Packaging and Deploying Resources topics.

Kullanıcıya özel durumun neden gerçekleştiği hakkında kapsamlı bilgiler sağlamak için, HelpLink özelliği bir yardım dosyasına BIR URL (veya urn) tutabilir.To provide the user with extensive information about why the exception occurred, the HelpLink property can hold a URL (or URN) to a help file.

ExceptionSınıfı, 0x80131500 değerine sahıp HRESULT COR_E_EXCEPTION kullanır.The Exception class uses the HRESULT COR_E_EXCEPTION, which has the value 0x80131500.

Sınıfının bir örneği için ilk özellik değerlerinin listesi için Exception bkz Exception . oluşturucular.For a list of initial property values for an instance of the Exception class, see the Exception constructors.

Performansla ilgili önemli noktalarPerformance considerations

Bir özel durum oluşturmak veya işlemek önemli miktarda sistem kaynağı ve yürütme süresi kullanır.Throwing or handling an exception consumes a significant amount of system resources and execution time. Öngörülebilir olayları veya akış denetimini işlemek için değil, yalnızca olağandışı koşulları işlemek için özel durumlar oluşturun.Throw exceptions only to handle truly extraordinary conditions, not to handle predictable events or flow control. Örneğin, bazı durumlarda (örneğin, bir sınıf kitaplığı geliştirilirken), yönteminizin geçerli parametrelerle çağrılması beklendiğinden, bir yöntem bağımsız değişkeni geçersiz olursa bir özel durum oluşturmak mantıklı olur.For example, in some cases, such as when you're developing a class library, it's reasonable to throw an exception if a method argument is invalid, because you expect your method to be called with valid parameters. Geçersiz metot bağımsız değişkeni, bir kullanım hatasının sonucu değilse, olağandışı bir şeyin gerçekleştiği anlamına gelir.An invalid method argument, if it is not the result of a usage error, means that something extraordinary has occurred. Buna karşılık, Kullanıcı girişi geçersiz olduğunda bir özel durum oluşturmaz, çünkü kullanıcıların zaman zaman geçersiz veri girmesini bekleyebilir.Conversely, do not throw an exception if user input is invalid, because you can expect users to occasionally enter invalid data. Bunun yerine, kullanıcıların geçerli bir giriş girebilmesi için bir yeniden deneme mekanizması sağlayın.Instead, provide a retry mechanism so users can enter valid input. Ya da kullanım hatalarını işlemek için özel durumlar kullanmanız gerekir.Nor should you use exceptions to handle usage errors. Bunun yerine, kullanım hatalarını belirlemek ve düzeltmek için onaylamaları kullanın.Instead, use assertions to identify and correct usage errors.

Ayrıca, bir dönüş kodu yeterliyse özel durum oluşturmaz; dönüş kodunu bir özel duruma dönüştürmeyin; Ayrıca, bir özel durumu düzenli olarak yakalamayın, yoksaymaz ve işleme devam edin.In addition, do not throw an exception when a return code is sufficient; do not convert a return code to an exception; and do not routinely catch an exception, ignore it, and then continue processing.

Özel durum yeniden oluşturuluyorRe-throwing an exception

Birçok durumda, bir özel durum işleyicisi yalnızca özel durumu çağırana iletmek istiyor.In many cases, an exception handler simply wants to pass the exception on to the caller. Bu en sık ' de ortaya çıkar:This most often occurs in:

  • Sırasıyla .NET Framework sınıf kitaplığındaki veya diğer sınıf kitaplıklarındaki yöntemlere yapılan çağrıları sarmalayan bir sınıf kitaplığı.A class library that in turn wraps calls to methods in the .NET Framework class library or other class libraries.

  • Önemli bir özel durumla karşılaştığı bir uygulama veya kitaplık.An application or library that encounters a fatal exception. Özel durum işleyicisi özel durumu günlüğe kaydedebilir ve sonra özel durumu yeniden oluşturabilir.The exception handler can log the exception and then re-throw the exception.

Bir özel durumu yeniden oluşturmak için önerilen yöntem, C# ' de throw deyimini ve bir ifade dahil etmeden Visual Basic throw deyimini kullanmaktır.The recommended way to re-throw an exception is to simply use the throw statement in C# and the Throw statement in Visual Basic without including an expression. Bu, özel durum çağırana yayıldığında tüm çağrı yığını bilgilerinin korunmasını sağlar.This ensures that all call stack information is preserved when the exception is propagated to the caller. Aşağıdaki örnek bunu göstermektedir.The following example illustrates this. Bir dize uzantısı yöntemi olan bir FindOccurrences veya daha fazla çağrısı, String.IndexOf(String, Int32) bağımsız değişkenlerini doğrulamadan önce bir veya daha fazla çağrısı kaydırır.A string extension method, FindOccurrences, wraps one or more calls to String.IndexOf(String, Int32) without validating its arguments beforehand.

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();
   }
}
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices

Public Module Library
   <Extension()>
   Public Function FindOccurrences(s As String, f As String) As Integer()
      Dim indexes As New List(Of Integer)
      Dim currentIndex As Integer = 0
      Try
         Do While currentIndex >= 0 And currentIndex < s.Length
            currentIndex = s.IndexOf(f, currentIndex)
            If currentIndex >= 0 Then
               indexes.Add(currentIndex)
               currentIndex += 1
            End If
         Loop
      Catch e As ArgumentNullException
         ' Perform some action here, such as logging this exception.
         
         Throw
      End Try
      Return indexes.ToArray()
   End Function
End Module

Bir çağıran daha sonra FindOccurrences iki kez çağırır.A caller then calls FindOccurrences twice. İkinci çağrıda FindOccurrences , çağıran bir null String.IndexOf(String, Int32) özel durum oluşturmak için yöntemi olan arama dizesi olarak bir gönderir ArgumentNullException .In the second call to FindOccurrences, the caller passes a null as the search string, which cases the String.IndexOf(String, Int32) method to throw an ArgumentNullException exception. Bu özel durum yöntemi tarafından işlenir FindOccurrences ve çağırana geri geçirilir.This exception is handled by the FindOccurrences method and passed back to the caller. Throw deyimi hiçbir ifade olmadan kullanıldığı için, örnekteki çıkış, çağrı yığınının korunmayacağını gösterir.Because the throw statement is used with no expression, the output from the example shows that the call stack is preserved.

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()
Module Example
   Public Sub Main()
      Dim s As String = "It was a cold day when..."
      Dim indexes() As Integer = s.FindOccurrences("a")
      ShowOccurrences(s, "a", indexes)
      Console.WriteLine()

      Dim toFind As String = Nothing
      Try
         indexes = s.FindOccurrences(toFind)
         ShowOccurrences(s, toFind, indexes)
      Catch e As ArgumentNullException
         Console.WriteLine("An exception ({0}) occurred.",
                           e.GetType().Name)
         Console.WriteLine("Message:{0}   {1}{0}", vbCrLf, e.Message)
         Console.WriteLine("Stack Trace:{0}   {1}{0}", vbCrLf, e.StackTrace)
      End Try
   End Sub
   
   Private Sub ShowOccurrences(s As String, toFind As String, indexes As Integer())
      Console.Write("'{0}' occurs at the following character positions: ",
                    toFind)
      For ctr As Integer = 0 To indexes.Length - 1
         Console.Write("{0}{1}", indexes(ctr),
                       If(ctr = indexes.Length - 1, "", ", "))
      Next
      Console.WriteLine()
   End Sub
End Module
' 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()

Buna karşılık, özel durum şu şekilde yeniden oluşturulursaIn contrast, if the exception is re-thrown by using the

throw e;
Throw e  

bildiriminde, tam çağrı yığını korunmaz ve örnek aşağıdaki çıktıyı üretir:statement, the full call stack is not preserved, and the example would generate 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 Library.FindOccurrences(String s, String f)  
   at Example.Main()  

Biraz daha az bir alternatif, yeni bir özel durum oluşturmak ve özgün özel durumun çağrı yığını bilgilerini bir iç özel durum içinde korumektir.A slightly more cumbersome alternative is to throw a new exception, and to preserve the original exception's call stack information in an inner exception. Çağıran daha sonra yeni özel durumun InnerException özelliğini kullanarak yığın çerçevesini ve özgün özel durumla ilgili diğer bilgileri alabilir.The caller can then use the new exception's InnerException property to retrieve stack frame and other information about the original exception. Bu durumda throw deyimleri şunlardır:In this case, the throw statement is:

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

Özel durumu işleyen Kullanıcı kodu, InnerException aşağıdaki özel durum işleyicisiyle gösterildiği gibi, özelliğin özgün özel durum hakkında bilgi içerdiğini bilmelidir.The user code that handles the exception has to know that the InnerException property contains information about the original exception, as the following exception handler illustrates.

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)
Try
   indexes = s.FindOccurrences(toFind)
   ShowOccurrences(s, toFind, indexes)
Catch e As ArgumentNullException
   Console.WriteLine("An exception ({0}) occurred.",
                     e.GetType().Name)
   Console.WriteLine("   Message: {1}{0}", vbCrLf, e.Message)
   Console.WriteLine("   Stack Trace:{0}   {1}{0}", vbCrLf, e.StackTrace)
   Dim ie As Exception = e.InnerException
   If ie IsNot Nothing Then
      Console.WriteLine("   The Inner Exception:")
      Console.WriteLine("      Exception Name: {0}", ie.GetType().Name)
      Console.WriteLine("      Message: {1}{0}", vbCrLf, ie.Message)
      Console.WriteLine("      Stack Trace:{0}   {1}{0}", vbCrLf, ie.StackTrace)
   End If
End Try
' 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)

Standart özel durumlar seçmeChoosing standard exceptions

Bir özel durum oluşturmanız gerektiğinde, genellikle özel bir özel durum uygulamak yerine .NET Framework var olan bir özel durum türü kullanabilirsiniz.When you have to throw an exception, you can often use an existing exception type in the .NET Framework instead of implementing a custom exception. Şu iki koşul altında standart bir özel durum türü kullanmanız gerekir:You should use a standard exception type under these two conditions:

  • Kullanım hatasından kaynaklanan bir özel durum (diğer bir deyişle, yönteminizi çağıran geliştirici tarafından yapılan program mantığındaki bir hata ile) üretiliyor.You are throwing an exception that is caused by a usage error (that is, by an error in program logic made by the developer who is calling your method). Genellikle,,, veya gibi bir özel durum ArgumentException oluşturursunuz ArgumentNullException InvalidOperationException NotSupportedException .Typically, you would throw an exception such as ArgumentException, ArgumentNullException, InvalidOperationException, or NotSupportedException. Özel durum nesnesinin örneği oluşturulurken özel durum nesnesinin oluşturucusuna sağladığınız dize, geliştiricinin onu çözebilmesi için hatayı betimlemelidir.The string you supply to the exception object's constructor when instantiating the exception object should describe the error so that the developer can fix it. Daha fazla bilgi için bkz Message . özelliği.For more information, see the Message property.

  • Mevcut bir .NET Framework özel durumuyla çağırana iletilebileceğiniz bir hatayı işleolursunuz.You are handling an error that can be communicated to the caller with an existing .NET Framework exception. Mümkün olan en fazla türetilmiş özel durumu oluşturmalısınız.You should throw the most derived exception possible. Örneğin, bir yöntem bir sabit listesi türünün geçerli bir üyesi olması için bir bağımsız değişken gerektiriyorsa, InvalidEnumArgumentException yerine bir (en fazla türetilmiş sınıf) oluşturmanız gerekir ArgumentException .For example, if a method requires an argument to be a valid member of an enumeration type, you should throw an InvalidEnumArgumentException (the most derived class) rather than an ArgumentException.

Aşağıdaki tabloda, ortak özel durum türleri ve bunları oluşturmak için gereken koşullar listelenmektedir.The following table lists common exception types and the conditions under which you would throw them.

Özel durumException KoşulCondition
ArgumentException Bir yönteme geçirilen null olmayan bir bağımsız değişken geçersiz.A non-null argument that is passed to a method is invalid.
ArgumentNullException Yöntemine geçirilen bir bağımsız değişken null .An argument that is passed to a method is null.
ArgumentOutOfRangeException Bağımsız değişken geçerli değer aralığının dışında.An argument is outside the range of valid values.
DirectoryNotFoundException Dizin yolunun bir parçası geçerli değil.Part of a directory path is not valid.
DivideByZeroException Tamsayı veya Decimal bölme işlemindeki payda sıfır.The denominator in an integer or Decimal division operation is zero.
DriveNotFoundException Bir sürücü kullanılamıyor veya yok.A drive is unavailable or does not exist.
FileNotFoundException Dosya yok.A file does not exist.
FormatException Bir değer, bir dizeden, gibi bir dönüştürme yöntemiyle dönüştürülecek uygun biçimde değil Parse .A value is not in an appropriate format to be converted from a string by a conversion method such as Parse.
IndexOutOfRangeException Dizin, bir dizi veya koleksiyonun sınırlarının dışındadır.An index is outside the bounds of an array or collection.
InvalidOperationException Bir nesnenin geçerli durumunda Yöntem çağrısı geçersizdir.A method call is invalid in an object's current state.
KeyNotFoundException Koleksiyonda bir üyeye erişmek için belirtilen anahtar bulunamıyor.The specified key for accessing a member in a collection cannot be found.
NotImplementedException Bir yöntem veya işlem uygulanmadı.A method or operation is not implemented.
NotSupportedException Yöntem veya işlem desteklenmiyor.A method or operation is not supported.
ObjectDisposedException Atılmış bir nesne üzerinde bir işlem gerçekleştirilir.An operation is performed on an object that has been disposed.
OverflowException Aritmetik, atama veya dönüştürme işlemi bir taşmaya neden olur.An arithmetic, casting, or conversion operation results in an overflow.
PathTooLongException Bir yol veya dosya adı, sistem tarafından tanımlanan en fazla uzunluğu aşıyor.A path or file name exceeds the maximum system-defined length.
PlatformNotSupportedException İşlem, geçerli platformda desteklenmiyor.The operation is not supported on the current platform.
RankException Bir yönteme yanlış sayıda boyut içeren bir dizi geçirilir.An array with the wrong number of dimensions is passed to a method.
TimeoutException Bir işlem için ayrılan zaman aralığının süresi doldu.The time interval allotted to an operation has expired.
UriFormatException Geçersiz bir Tekdüzen Kaynak tanımlayıcısı (URI) kullanılıyor.An invalid Uniform Resource Identifier (URI) is used.

Özel durum uygulamaImplementing custom exceptions

Aşağıdaki durumlarda, bir hata koşulunu işlemek için mevcut .NET Framework özel durumunun kullanılması yeterli değildir:In the following cases, using an existing .NET Framework exception to handle an error condition is not adequate:

  • Özel durum, mevcut bir .NET Framework özel durumuyla eşleştirilenemeyen benzersiz bir program hatası yansıtmaktadır.When the exception reflects a unique program error that cannot be mapped to an existing .NET Framework exception.

  • Özel durum, mevcut bir .NET Framework özel durumu için uygun işleme göre farklı bir işleme gerektirdiğinde veya özel durumun benzer bir özel durumdan ayırt edilebilir olması gerekir.When the exception requires handling that is different from the handling that is appropriate for an existing .NET Framework exception, or the exception must be disambiguated from a similar exception. Örneğin, ArgumentOutOfRangeException hedef integral türü aralığının dışında bir dizenin sayısal gösterimini ayrıştırırken bir özel durum oluşturursanız, çağıran tarafından yöntemi çağırırken uygun kısıtlanmış değerleri vermediğinden elde edilen bir hata için aynı özel durumu kullanmak istemezsiniz.For example, if you throw an ArgumentOutOfRangeException exception when parsing the numeric representation of a string that is out of range of the target integral type, you would not want to use the same exception for an error that results from the caller not supplying the appropriate constrained values when calling the method.

ExceptionSınıfı, .NET Framework tüm özel durumların temel sınıfıdır.The Exception class is the base class of all exceptions in the .NET Framework. Birçok türetilmiş sınıf, sınıfının üyelerinin devralınmış davranışını kullanır Exception ; üyelerini geçersiz kılmaz Exception veya benzersiz Üyeler tanımlamaz.Many derived classes rely on the inherited behavior of the members of the Exception class; they do not override the members of Exception, nor do they define any unique members.

Kendi özel durum sınıfınızı tanımlamak için:To define your own exception class:

  1. Öğesinden devralan bir sınıf tanımlayın Exception .Define a class that inherits from Exception. Gerekirse, özel durum hakkında ek bilgi sağlamak için sınıfınızın gerek duyduğu benzersiz üyeleri tanımlayın.If necessary, define any unique members needed by your class to provide additional information about the exception. Örneğin, sınıfı, ArgumentException ParamName bağımsız değişkeni özel duruma neden olan parametrenin adını belirten bir özelliği içerir ve RegexMatchTimeoutException özellik, MatchTimeout zaman aşımı aralığını gösteren bir özelliği içerir.For example, the ArgumentException class includes a ParamName property that specifies the name of the parameter whose argument caused the exception, and the RegexMatchTimeoutException property includes a MatchTimeout property that indicates the time-out interval.

  2. Gerekirse, işlevselliği değiştirmek veya değiştirmek istediğiniz tüm devralınan üyeleri geçersiz kılın.If necessary, override any inherited members whose functionality you want to change or modify. ' Nin en çok türetilmiş sınıflarının Exception devralınan üyelerin davranışını geçersiz kılmadığını unutmayın.Note that most existing derived classes of Exception do not override the behavior of inherited members.

  3. Özel özel durum nesnenizin seri hale getirilebilir olup olmadığını belirleme.Determine whether your custom exception object is serializable. Serileştirme, özel durum hakkında bilgi kaydetmenizi ve özel durum bilgilerinin bir sunucu ve bir istemci proxy 'si tarafından, uzak bir bağlamda paylaşılmasına izin verir.Serialization enables you to save information about the exception and permits exception information to be shared by a server and a client proxy in a remoting context. Özel durum nesnesini seri hale getirilebilir hale getirmek için özniteliği ile işaretleyin SerializableAttribute .To make the exception object serializable, mark it with the SerializableAttribute attribute.

  4. Özel durum sınıfınızın oluşturucularını tanımlayın.Define the constructors of your exception class. Genellikle, özel durum sınıfları aşağıdaki oluşturuculardan bir veya daha fazlasına sahiptir:Typically, exception classes have one or more of the following constructors:

    • Exception(), yeni bir özel durum nesnesinin özelliklerini başlatmak için varsayılan değerleri kullanır.Exception(), which uses default values to initialize the properties of a new exception object.

    • Exception(String), belirtilen bir hata iletisiyle yeni bir özel durum nesnesi Başlatan.Exception(String), which initializes a new exception object with a specified error message.

    • Exception(String, Exception), belirtilen bir hata iletisiyle yeni bir özel durum nesnesi başlatan iç özel durum.Exception(String, Exception), which initializes a new exception object with a specified error message and inner exception.

    • Exception(SerializationInfo, StreamingContext), protected seri hale getirilmiş verilerden yeni bir özel durum nesnesi Başlatan bir Oluşturucu.Exception(SerializationInfo, StreamingContext), which is a protected constructor that initializes a new exception object from serialized data. Özel durum nesneniz seri hale getirilebilir yapmayı seçtiyseniz bu oluşturucuyu uygulamalısınız.You should implement this constructor if you've chosen to make your exception object serializable.

Aşağıdaki örnek özel bir özel durum sınıfının kullanımını gösterir.The following example illustrates the use of a custom exception class. NotPrimeExceptionBir istemci, ana olmayan bir başlangıç numarası belirterek bir asal sayı dizisi almaya çalıştığında oluşturulan bir özel durum tanımlar.It defines a NotPrimeException exception that is thrown when a client tries to retrieve a sequence of prime numbers by specifying a starting number that is not prime. Özel durum, NonPrime özel duruma neden olan asal olmayan sayıyı döndüren yeni bir özelliğini tanımlar.The exception defines a new property, NonPrime, that returns the non-prime number that caused the exception. Bir korumalı parametresiz oluşturucuyu ve ile bir oluşturucuyu SerializationInfo ve serileştirme parametrelerini uygulamanın yanı sıra StreamingContext , NotPrimeException özelliği desteklemek için üç ek Oluşturucu tanımlar NonPrime .Besides implementing a protected parameterless constructor and a constructor with SerializationInfo and StreamingContext parameters for serialization, the NotPrimeException class defines three additional constructors to support the NonPrime property. Her Oluşturucu, asal olmayan sayının değerini korumak için bir temel sınıf oluşturucusunu çağırır.Each constructor calls a base class constructor in addition to preserving the value of the non-prime number. NotPrimeExceptionSınıfı, özniteliğiyle de işaretlenir SerializableAttribute .The NotPrimeException class is also marked with the SerializableAttribute attribute.

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; } }
}
Imports System.Runtime.Serialization

<Serializable()> _
Public Class NotPrimeException : Inherits Exception
   Private notAPrime As Integer

   Protected Sub New()
      MyBase.New()
   End Sub

   Public Sub New(value As Integer)
      MyBase.New(String.Format("{0} is not a prime number.", value))
      notAPrime = value
   End Sub

   Public Sub New(value As Integer, message As String)
      MyBase.New(message)
      notAPrime = value
   End Sub

   Public Sub New(value As Integer, message As String, innerException As Exception)
      MyBase.New(message, innerException)
      notAPrime = value
   End Sub

   Protected Sub New(info As SerializationInfo,
                     context As StreamingContext)
      MyBase.New(info, context)
   End Sub

   Public ReadOnly Property NonPrime As Integer
      Get
         Return notAPrime
      End Get
   End Property
End Class

PrimeNumberGeneratorAşağıdaki örnekte gösterilen sınıf, 2 ' den asal sayıların sırasını, sınıf oluşturucusuna yapılan çağrıda istemci tarafından belirtilen bir sınıra göre hesaplamak Için eleyeninin listesini kullanır.The PrimeNumberGenerator class shown in the following example uses the Sieve of Eratosthenes to calculate the sequence of prime numbers from 2 to a limit specified by the client in the call to its class constructor. GetPrimesFromYöntemi, belirtilen bir alt sınırdan büyük veya buna eşit olan tüm asal sayıları döndürür, ancak NotPrimeException alt sınır asal sayı değilse bir oluşturur.The GetPrimesFrom method returns all prime numbers that are greater than or equal to a specified lower limit, but throws a NotPrimeException if that lower limit is not a prime number.

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();
   }
}
Imports System.Collections.Generic

<Serializable()> Public Class PrimeNumberGenerator
   Private Const START As Integer = 2
   Private maxUpperBound As Integer = 10000000
   Private upperBound As Integer
   Private primeTable() As Boolean
   Private primes As New List(Of Integer)

   Public Sub New(upperBound As Integer)
      If upperBound > maxUpperBound Then
         Dim message As String = String.Format(
             "{0} exceeds the maximum upper bound of {1}.",
             upperBound, maxUpperBound)
         Throw New ArgumentOutOfRangeException(message)
      End If
      Me.upperBound = upperBound
      ' Create array and mark 0, 1 as not prime (True).
      ReDim primeTable(upperBound)
      primeTable(0) = True
      primeTable(1) = True

      ' Use Sieve of Eratosthenes to determine prime numbers.
      For ctr As Integer = START To CInt(Math.Ceiling(Math.Sqrt(upperBound)))
         If primeTable(ctr) Then Continue For

         For multiplier As Integer = ctr To CInt(upperBound \ ctr)
            If ctr * multiplier <= upperBound Then primeTable(ctr * multiplier) = True
         Next
      Next
      ' Populate array with prime number information.
      Dim index As Integer = START
      Do While index <> -1
         index = Array.FindIndex(primeTable, index, Function(flag)
                                                       Return Not flag
                                                    End Function)
         If index >= 1 Then
            primes.Add(index)
            index += 1
         End If
      Loop
   End Sub

   Public Function GetAllPrimes() As Integer()
      Return primes.ToArray()
   End Function

   Public Function GetPrimesFrom(prime As Integer) As Integer()
      Dim start As Integer = primes.FindIndex(Function(value)
                                                 Return value = prime
                                              End Function)
      If start < 0 Then
         Throw New NotPrimeException(prime, String.Format("{0} is not a prime number.", prime))
      Else
         Return primes.FindAll(Function(value)
                                  Return value >= prime
                               End Function).ToArray()
      End If
   End Function
End Class

Aşağıdaki örnek, GetPrimesFrom biri uygulama etki alanı sınırlarını kesen, biri olan asal olmayan sayılarla iki çağrı yapar.The following example makes two calls to the GetPrimesFrom method with non-prime numbers, one of which crosses application domain boundaries. Her iki durumda da, özel durum oluşturulur ve istemci kodunda başarıyla işlenir.In both cases, the exception is thrown and successfully handled in client code.

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("--------");
      }
   }
}
Imports System.Reflection

Module Example
   Sub Main()
      Dim limit As Integer = 10000000
      Dim primes As New PrimeNumberGenerator(limit)
      Dim start As Integer = 1000001
      Try
         Dim values() As Integer = primes.GetPrimesFrom(start)
         Console.WriteLine("There are {0} prime numbers from {1} to {2}",
                           start, limit)
      Catch e As NotPrimeException
         Console.WriteLine("{0} is not prime", e.NonPrime)
         Console.WriteLine(e)
         Console.WriteLine("--------")
      End Try

      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
      Dim gen As PrimeNumberGenerator = domain.CreateInstanceAndUnwrap(
                                        GetType(Example).Assembly.FullName,
                                        "PrimeNumberGenerator", True,
                                        BindingFlags.Default, Nothing,
                                        {1000000}, Nothing, Nothing)
      Try
         start = 100
         Console.WriteLine(gen.GetPrimesFrom(start))
      Catch e As NotPrimeException
         Console.WriteLine("{0} is not prime", e.NonPrime)
         Console.WriteLine(e)
         Console.WriteLine("--------")
      End Try
   End Sub
End Module
' The example displays the following output:
'      1000001 is not prime
'      NotPrimeException: 1000001 is not a prime number.
'         at PrimeNumberGenerator.GetPrimesFrom(Int32 prime)
'         at Example.Main()
'      --------
'      100 is not prime
'      NotPrimeException: 100 is not a prime number.
'         at PrimeNumberGenerator.GetPrimesFrom(Int32 prime)
'         at Example.Main()
'      --------

Windows Çalışma Zamanı ve .NET Framework 4.5.1.NET Framework 4.5.1Windows Runtime and .NET Framework 4.5.1.NET Framework 4.5.1

Windows 8.x Mağazası uygulamaları için .NET.NET for Windows 8.x Store apps' De Windows 8Windows 8 , bir özel durum non-.NET Framework yığın çerçeveleri aracılığıyla yayıldıysa, bazı özel durum bilgileri genellikle kaybedilir.In Windows 8.x Mağazası uygulamaları için .NET.NET for Windows 8.x Store apps for Windows 8Windows 8, some exception information is typically lost when an exception is propagated through non-.NET Framework stack frames. Ve ile başlayarak .NET Framework 4.5.1.NET Framework 4.5.1 Windows 8.1Windows 8.1 , ortak dil çalışma zamanı, Exception özel durum non-.NET Framework yığın çerçevesinde değiştirilmediği takdirde oluşturulan özgün nesneyi kullanmaya devam eder.Starting with the .NET Framework 4.5.1.NET Framework 4.5.1 and Windows 8.1Windows 8.1, the common language runtime continues to use the original Exception object that was thrown unless that exception was modified in a non-.NET Framework stack frame.

Oluşturucular

Exception()

Exception sınıfının yeni bir örneğini başlatır.Initializes a new instance of the Exception class.

Exception(SerializationInfo, StreamingContext)

Exception sınıfının yeni bir örneğini serileştirilmiş verilerle başlatır.Initializes a new instance of the Exception class with serialized data.

Exception(String)

Belirtilen bir hata iletisiyle sınıfın yeni bir örneğini başlatır Exception .Initializes a new instance of the Exception class with a specified error message.

Exception(String, Exception)

ExceptionBelirtilen bir hata iletisiyle sınıfın yeni bir örneğini ve bu özel durumun nedeni olan iç özel duruma bir başvuruyu başlatır.Initializes a new instance of the Exception class with a specified error message and a reference to the inner exception that is the cause of this exception.

Özellikler

Data

Özel durum hakkında ek kullanıcı tanımlı bilgiler sağlayan anahtar/değer çiftleri koleksiyonunu alır.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

HelpLink

Bu özel durumla ilişkili Yardım dosyasının bağlantısını alır veya ayarlar.Gets or sets a link to the help file associated with this exception.

HResult

Belirli bir özel duruma atanan kodlanmış bir sayısal değer olan HRESULT 'yi alır veya ayarlar.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

InnerException

ExceptionGeçerli özel duruma neden olan örneği alır.Gets the Exception instance that caused the current exception.

Message

Geçerli özel durumu açıklayan bir ileti alır.Gets a message that describes the current exception.

Source

Uygulamanın veya hataya neden olan nesnenin adını alır veya ayarlar.Gets or sets the name of the application or the object that causes the error.

StackTrace

Çağrı yığınında anlık çerçevelerin dize gösterimini alır.Gets a string representation of the immediate frames on the call stack.

TargetSite

Geçerli özel durumu oluşturan yöntemi alır.Gets the method that throws the current exception.

Yöntemler

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.Determines whether the specified object is equal to the current object.

(Devralındığı yer: Object)
GetBaseException()

Türetilmiş bir sınıfta geçersiz kılınırsa, Exception bir veya daha fazla sonraki özel durumun kök nedeni olan öğesini döndürür.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

GetHashCode()

Varsayılan karma işlevi olarak işlev görür.Serves as the default hash function.

(Devralındığı yer: Object)
GetObjectData(SerializationInfo, StreamingContext)

Türetilmiş bir sınıfta geçersiz kılınırsa, SerializationInfo özel durum hakkındaki bilgileri ayarlar.When overridden in a derived class, sets the SerializationInfo with information about the exception.

GetType()

Geçerli örneğin çalışma zamanı türünü alır.Gets the runtime type of the current instance.

GetType()

TypeGeçerli örneği alır.Gets the Type of the current instance.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli bir basit kopyasını oluşturur Object .Creates a shallow copy of the current Object.

(Devralındığı yer: Object)
ToString()

Geçerli özel durumun dize gösterimini oluşturur ve döndürür.Creates and returns a string representation of the current exception.

Ekinlikler

SerializeObjectState

Özel durum hakkında serileştirilmiş veri içeren bir özel durum nesnesi oluşturmak için bir özel durum serileştirildiğinde gerçekleşir.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

Şunlara uygulanır

Ayrıca bkz.