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.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class Exception : System.Runtime.InteropServices._Exception, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class Exception : System.Runtime.Serialization.ISerializable
type Exception = class
type Exception = class
    interface ISerializable
type Exception = class
    interface ISerializable
    interface _Exception
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, ArithmeticException hatalarını işlemek için tanımlanan bir catch bloğunu gösterir.The following example demonstrates a catch block that is defined to handle ArithmeticException errors. Bu catch bloğu, DivideByZeroException ArithmeticException türediği ve catch hataları için açıkça tanımlanmış bir DivideByZeroException bloğu olmadığı için DivideByZeroException hatalarını da yakalar.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ümde: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 özel durumlar 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, aşağıdaki örnekte Object.Equals(Object) yönteminin geçersiz kılınması, obj bağımsız değişkeninin 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
    

    obj null NullReferenceException özel durumu, Object.Equals geçersiz kılma çağrılmadan önce null için açıkça test etmek ve sonra yeniden derlemek için kaynak kodu değiştirilerek 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 null bağımsız değişkenini işleyen düzeltilmiş kaynak kodu içerir.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, hata ayıklama yapılarında kullanım hatalarını belirlemek için Debug.Assert yöntemini ve hem hata ayıklama hem de sürüm yapılarında kullanım hatalarını belirlemek için Trace.Assert 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, tarih dizesi bir DateTime değere dönüştürülemiyorsa, bir FormatException özel durum oluşturan DateTime.ParseExact yöntemini kullanarak, tarih dizesini ayrıştırarak bir Boolean değeri döndüren DateTime.TryParseExact yöntemini çağırarak.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, dosyanın mevcut olup olmadığını denetlemek için ilk olarak File.Exists yöntemini çağırabilir ve 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 StreamReader nesnesini örnekleyerek veya Open metodunu çağırarak dosyayı açmaya çalışmak, bir FileNotFoundException özel durumu 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, ortak dil çalışma zamanı ek bellek ayıramadığında herhangi bir yöntem OutOfMemoryException 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, AppDomain.UnhandledException gibi bir olay kullanabilir ve özel durum bilgilerini günlüğe kaydetmek için Environment.FailFast metodunu çağırabilir ve uygulamanın sonlandırılmadan önce başarısız olan kullanıcıya bildirimde bulunabilir.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 kodu ve özel durum işleme kodunun try bloklara ve catch bloklara ayrılmasını temel alan bir özel durum işleme modeli sağlar.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. Tek bir veya daha fazla catch bloğu olabilir, her biri belirli bir özel durum türünü işlemek üzere tasarlanır ya da 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 try bloğu olarak adlandırılır.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 try bloğu tarafından oluşturulan özel durumları işleyen uygulama kodu bir catch bildirimine yerleştirilir ve catch bloğu olarak adlandırılır.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 bloğu bir try bloğuyla ilişkilendirilir ve her catch bloğu, 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.

try bloğunda bir özel durum oluştuğunda, sistem özel durumu işleyen bir catch bloğunu bulana kadar, ilişkili catch bloklarını uygulama kodunda göründükleri sırada arar.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. catch bloğu, catch bloğunun tür filtresi T veya T türetilen herhangi bir türü belirtiyorsa T türünde bir özel durumu işler.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 catch bloğunu bulduktan sonra aramayı durduruyor.The system stops searching after it finds the first catch block that handles the exception. Bu nedenle, uygulama kodunda, bu bölümü izleyen örnekte gösterildiği gibi, bir türü işleyen bir catch bloğu, temel türlerini işleyen bir catch bloğundan önce 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. System.Exception işleyen bir catch bloğu son olarak belirtilir.A catch block that handles System.Exception is specified last.

Geçerli try bloğunun ilişkili catch bloklarından hiçbiri özel durumu tutamacına ve geçerli try bloğu geçerli çağrıda diğer try bloklarıyla içiçe geçmişse, sonraki kapsayan catch bloğunun ilişkili try blokları 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. Özel durum için catch bloğu 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. Geçerli çağrıda özel durum için catch bloğu bulunamazsa, özel durum çağrı yığınına geçirilir ve özel durumu işleyen bir catch bloğu için önceki yığın çerçevesi 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. Çağrı yığınının üst kısmına, özel durumu işleyen bir catch bloğunu bulmadan ulaşılırsa, 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, özel durum nesnesinin Message ö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 Message özelliğine bakın.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

Exception sınıfı, kod konumunu, türü, yardım dosyasını ve özel durum nedenini (StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSiteve Databelirlemesine 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 varsa, 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 Data özelliğindeki anahtar/değer çiftleri koleksiyonu olarak depolanabilir.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 ResourceManager sınıfı kullanılarak bir kaynak dosyasından sağlanabilir.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 meydana geldi hakkında kapsamlı bilgiler sağlamak için, HelpLink özelliği bir yardım dosyasına bir URL (veya URN) içerebilir.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.

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

Exception sınıfının bir örneği için ilk özellik değerlerinin listesi için, Exception oluşturuculara bakın.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 yol, bir ifade dahil etmeden Visual Basic içindeki throw deyimini C# ve 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. FindOccurrencesdize genişletme yöntemi, bir veya daha fazla çağrısı, bağımsız değişkenlerini önceden doğrulamadan String.IndexOf(String, Int32) bir veya daha fazla çağı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

Çağıran daha sonra FindOccurrences iki kez çağırır.A caller then calls FindOccurrences twice. FindOccurrencesikinci çağrısında çağıran, arama dizesi olarak bir null geçirir ve bu da String.IndexOf(String, Int32) yöntemi ArgumentNullException özel durum oluşturur.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 FindOccurrences yöntemi tarafından işlenir 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, aşağıdaki özel durum işleyicisiyle gösterildiği gibi InnerException özelliğinin ö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 ArgumentException, ArgumentNullException, InvalidOperationExceptionveya NotSupportedExceptiongibi bir özel durum oluşturursunuz.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 Message özelliğine bakın.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, bir ArgumentExceptionyerine bir InvalidEnumArgumentException (en fazla türetilmiş sınıf) oluşturmanız gerekir.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 Bir tamsayı veya Decimal bölme işlemindeki payda değeri sıfırdı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, Parsegibi bir dönüştürme yöntemiyle bir dizeden dönüştürülecek uygun biçimde değil.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, hedef integral türü aralığının dışında bir dizenin sayısal gösterimini ayrıştırırken ArgumentOutOfRangeException bir özel durum oluşturduysanız, çağıran, 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.

Exception sınıfı, .NET Framework tüm özel durumların taban 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, Exception sınıfının üyelerinin devralınan davranışına dayanır; Exceptionüyelerini geçersiz kılmaz 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. Exceptiondevralan bir sınıf tanımlayın.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 ArgumentException sınıfı, bağımsız değişkeni özel duruma neden olan parametrenin adını belirten bir ParamName özelliği içerir ve RegexMatchTimeoutException özelliği zaman aşımı aralığını belirten bir MatchTimeout ö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. Exception en fazla türetilen sınıfların 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 SerializableAttribute özniteliğiyle işaretleyin.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:

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

    • Yeni bir özel durum nesnesini belirtilen bir hata iletisiyle Başlatan Exception(String).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.

    • seri hale getirilmiş verilerden yeni bir özel durum nesnesini Başlatan bir protected Oluşturucu olan Exception(SerializationInfo, StreamingContext).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. Bir istemci, ana olmayan bir başlangıç numarası belirterek bir asal sayı dizisi almayı denediğinde oluşturulan NotPrimeException özel durumunu 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, özel duruma neden olan asal olmayan sayıyı döndüren NonPrimeyeni 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 serileştirme için SerializationInfo ve StreamingContext parametreleri olan bir oluşturucuyu uygulamanın yanı sıra, NotPrimeException sınıfı NonPrime özelliğini desteklemek için üç ek Oluşturucu tanımlar.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. NotPrimeException sınıfı, SerializableAttribute özniteliğiyle de işaretlenir.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

Aşağıdaki örnekte gösterilen PrimeNumberGenerator 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 Boifi 'yi 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. GetPrimesFrom yö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 alt sınır asal sayı değilse bir NotPrimeException 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, biri uygulama etki alanı sınırlarının kesiştiği bir ana olmayan sayılarla GetPrimesFrom yöntemine 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 8Windows 8için Windows 8.x Mağazası uygulamaları için .NET.NET for Windows 8.x Store apps, bazı özel durum bilgileri genellikle özel bir durum non-.NET Framework yığın çerçeveleri aracılığıyla yayıldığında 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. .NET Framework 4.5.1.NET Framework 4.5.1 ve Windows 8.1Windows 8.1başlayarak, ortak dil çalışma zamanı, özel durum bir non-.NET Framework yığın çerçevesinde değiştirilmediği takdirde oluşturulan özgün Exception nesnesini 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 Exception sınıfının yeni bir örneğini başlatır.Initializes a new instance of the Exception class with a specified error message.

Exception(String, Exception)

Belirtilen bir hata iletisiyle Exception sınıfını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

Geçerli özel duruma neden olan Exception örneğini 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 nesneyle 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, bir veya daha fazla sonraki özel durumun kök nedeni olan Exception 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 durumla ilgili bilgilerle 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.

MemberwiseClone()

Geçerli Objectbasit bir kopyasını oluşturur.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.