Exception Sınıf

Tanım

Uygulama yürütme sırasında oluşan hataları temsil eder.

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 örnekte, hataları işlemek ArithmeticException için tanımlanan ( catch``with F# dilinde) bir blok gösterilmektedir. Bu catch blok da hata yakalarDivideByZeroException, çünkü DivideByZeroException türetilir ArithmeticException ve hatalar için DivideByZeroException açıkça tanımlanmış bir blok yokturcatch.

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

*/
module ExceptionTestModule

open System

let x = 0
try
    let y = 100 / x
    ()
with
| :? ArithmeticException as e ->
    printfn $"ArithmeticException Handler: {e}"
| e ->
    printfn $"Generic Exception Handler: {e}"

// This code example produces the following results:
//     ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero.
//        at <StartupCode$fs>.$ExceptionTestModule.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. Bir hata oluştuğunda, sistem veya şu anda yürütülen uygulama, hata hakkında bilgi içeren bir özel durum oluşturarak bunu bildirir. Bir özel durum oluşturulduktan sonra, uygulama veya varsayılan özel durum işleyicisi tarafından işlenir.

Bu bölümdeki konular:

Hatalar ve özel durumlar
Try/catch blokları
Özel durum türü özellikleri
Özel durum sınıfı özellikleri
Performansla ilgili dikkat edilmesi gerekenler
Özel durum yeniden oluşturma
Standart özel durumlar seçme
Özel durum uygulama

Hatalar ve özel durumlar

Çalışma zamanı hataları çeşitli nedenlerle oluşabilir. Ancak, tüm hatalar kodunuzda özel durumlar olarak işlenmemelidir. Çalışma zamanında oluşabilecek bazı hata kategorileri ve bunlara yanıt vermenin uygun yolları aşağıdadır.

  • Kullanım hataları. Kullanım hatası, program mantığında özel durumla sonuçlanabilir bir hatayı temsil eder. Ancak, hata özel durum işleme yoluyla değil, hatalı kodu değiştirerek giderilmelidir. Örneğin, aşağıdaki örnekte yönteminin Object.Equals(Object) geçersiz kılınması, bağımsız değişkenin obj her zaman null olmayan olması gerektiğini varsayar.

    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));
       }
    }
    
    // In F#, null is not a valid state for declared types 
    // without 'AllowNullLiteralAttribute'
    [<AllowNullLiteral>]
    type Person() =
        member val Name = "" with get, set
    
        override this.GetHashCode() =
            this.Name.GetHashCode()
    
        override this.Equals(obj) =
            // This implementation contains an error in program logic:
            // It assumes that the obj argument is not null.
            let p = obj :?> Person
            this.Name.Equals p.Name
    
    let p1 = Person()
    p1.Name <- "John"
    let p2: Person = null
    
    // The following throws a NullReferenceException.
    printfn $"p1 = p2: {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
    

    Olduğunda NullReferenceException sonuçlanan obj özel durum, null geçersiz kılmayı çağırmadan Object.Equals ve sonra yeniden derlemeden önce kaynak kodu açıkça null için test edilecek şekilde değiştirilerek ortadan kaldırılabilir. Aşağıdaki örnek, bir null bağımsız değişkeni işleyen düzeltilmiş kaynak kodunu içerir.

    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
    
    // In F#, null is not a valid state for declared types 
    // without 'AllowNullLiteralAttribute'
    [<AllowNullLiteral>]
    type Person() =
        member val Name = "" with get, set
    
        override this.GetHashCode() =
            this.Name.GetHashCode()
    
        override this.Equals(obj) =
            // This implementation handles a null obj argument.
            match obj with
            | :? Person as p -> 
                this.Name.Equals p.Name
            | _ ->
                false
    
    let p1 = Person()
    p1.Name <- "John"
    let p2: Person = null
    
    printfn $"p1 = p2: {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şleme kullanmak yerine hata ayıklama derlemelerindeki kullanım hatalarını belirlemek için yöntemini ve Trace.Assert hem hata ayıklama hem de yayın derlemelerindeki kullanım hatalarını belirlemek için yöntemini kullanabilirsinizDebug.Assert. Daha fazla bilgi için bkz. Yönetilen Kodda Onaylamalar.

  • Program hataları. Program hatası, hatasız kod yazarak mutlaka kaçınılamayan bir çalışma zamanı hatasıdır.

    Bazı durumlarda, program hatası beklenen veya rutin bir hata koşulunu yansıtabilir. Bu durumda, program hatasıyla başa çıkmak için özel durum işleme kullanmaktan kaçınmak ve bunun yerine işlemi yeniden denemek isteyebilirsiniz. Örneğin, kullanıcının belirli bir biçimde tarih girişi bekleniyorsa, yöntemini çağırarak DateTime.TryParseExact tarih dizesini ayrıştırabilirsiniz. Bu yöntem, tarih dizesi değere dönüştürülemediğinde özel FormatException durum oluşturan yöntemini kullanmak DateTime.ParseExact yerine ayrıştırma işleminin başarılı olup olmadığını belirten bir DateTime değer döndürürBoolean. Benzer şekilde, bir kullanıcı var olmayan bir dosyayı açmaya çalışırsa, önce dosyanın var olup olmadığını denetlemek için yöntemini çağırabilir File.Exists ve yoksa, kullanıcıya oluşturmak isteyip istemediğini sorabilirsiniz.

    Diğer durumlarda, program hatası kodunuzda işlenebilen beklenmeyen bir hata koşulunu yansıtır. Örneğin, bir dosyanın var olduğundan emin olmak için denetlemiş olsanız bile, dosyayı açabilmeniz için önce silinebilir veya bozulmuş olabilir. Bu durumda, bir StreamReader nesne örneği oluşturarak veya yöntemini çağırarak Open dosyayı açmaya çalışmak bir FileNotFoundException özel durum oluşturabilir. Böyle durumlarda, hatadan kurtarmak için özel durum işlemeyi kullanmanız gerekir.

  • Sistem hataları. Sistem hatası, program aracılığıyla anlamlı bir şekilde işlenemeyen bir çalışma zamanı hatasıdır. Örneğin, ortak dil çalışma zamanı ek bellek ayıramıyorsa herhangi bir yöntem özel OutOfMemoryException durum oluşturabilir. Normalde sistem hataları özel durum işleme kullanılarak işlenmez. Bunun yerine, gibi AppDomain.UnhandledException bir olay kullanabilir ve özel durum bilgilerini günlüğe kaydetmek ve uygulama sonlandırılmadan önce kullanıcıya hatayı bildirmek için yöntemini çağırabilirsiniz Environment.FailFast .

Try/catch bloğu

Ortak dil çalışma zamanı, özel durumların nesneler olarak temsilini ve program kodu ile özel durum işleme kodunun bloklara ve catch bloklara ayrılmasını temel alan bir özel durum işleme try modeli sağlar. Her biri belirli bir özel durum türünü işlemek için tasarlanmış bir veya daha fazla catch blok veya başka bir bloktan daha belirli bir özel durumu yakalamak için tasarlanmış bir blok olabilir.

Bir uygulama, bir uygulama kodu bloğunun yürütülmesi sırasında oluşan özel durumları işlerse, kod bir try deyimi içine yerleştirilmelidir ve blok olarak adlandırılır try . Bir try blok tarafından oluşan özel durumları işleyen uygulama kodu bir catch deyimi içine yerleştirilir ve blok olarak adlandırılır catch . Sıfır veya daha fazla catch blok bir try blokla ilişkilendirilir ve her catch blok, işlediği özel durum türlerini belirleyen bir tür filtresi içerir.

Bir try blokta özel durum oluştuğunda sistem, özel durumu işleyen bir catch blok bulana kadar ilişkili catch blokları uygulama kodunda göründükleri sırayla arar. catch Catch bloğunun tür T filtresi veya türetilen herhangi bir türü T belirtiyorsaT, blok türü özel durumunu işler. Sistem, özel durumu işleyen ilk catch bloğu buldukta aramayı durdurur. Bu nedenle, uygulama kodunda, catch bir türü işleyen bir bloğun, bu bölümü izleyen örnekte gösterildiği gibi, temel türlerini işleyen bir catch blok öncesinde belirtilmesi gerekir. İşleyen System.Exception bir catch bloğu en son belirtilir.

Geçerli try blokla ilişkili bloklardan catch hiçbiri özel durumu işlemezse ve geçerli try blok geçerli çağrıdaki diğer try blokların içinde iç içe yerleştirilmişse, sonraki kapsayan catch try blokla ilişkili bloklar aranır. Özel durum için bir catch blok bulunmazsa, sistem geçerli çağrıda önceki iç içe yerleştirme düzeylerini arar. Geçerli çağrıda özel durum için bir catch blok bulunmazsa, özel durum çağrı yığınına geçirilir ve önceki yığın çerçevesinde özel durumu işleyen bir catch blok aranılır. Çağrı yığını araması, özel durum işlenene kadar veya çağrı yığınında başka çerçeve kalmayıncaya kadar devam eder. Çağrı yığınının üst kısmına özel durumu işleyen bir catch blok bulunmaksızın ulaşılırsa, varsayılan özel durum işleyicisi bunu işler ve uygulama sonlandırılır.

F# deneyin.. with İfadesi

F# blokları kullanmaz catch . Bunun yerine, oluşturulan bir özel durum deseni tek with bir blok kullanılarak eşleştirilir. Bu bir ifade olduğundan, deyimi yerine tüm yolların aynı türü döndürmesi gerekir. Daha fazla bilgi edinmek için bkz . Deneme... ifadesiyle birlikte.

Özel durum türü özellikleri

Özel durum türleri aşağıdaki özellikleri destekler:

  • Hatayı açıklayan, okunabilir metin. Bir özel durum oluştuğunda, çalışma zamanı kullanıcıyı hatanın doğası hakkında bilgilendirmek ve sorunu çözmek için eylem önermek için bir kısa mesaj sağlar. Bu metin iletisi özel durum nesnesinin Message özelliğinde tutulur. Özel durum nesnesinin oluşturulması sırasında, söz konusu özel durumun ayrıntılarını açıklamak için oluşturucuya bir metin dizesi geçirebilirsiniz. Oluşturucuya hiçbir hata iletisi bağımsız değişkeni sağlanmazsa, varsayılan hata iletisi kullanılır. Daha fazla bilgi için özelliğine Message bakın.

  • Özel durum oluştuğunda çağrı yığınının durumu. özelliği, StackTrace hatanın kodda nerede oluştuğunun belirlenmesi için kullanılabilecek bir yığın izlemesi taşır. Yığın izlemesi, çağrılan tüm yöntemleri ve çağrıların yapıldığı kaynak dosyadaki satır numaralarını listeler.

Özel durum sınıfı özellikleri

Exception sınıfı, kod konumunu, türünü, yardım dosyasını ve özel durumun nedenini tanımlamaya yardımcı olan bir dizi özellik içerir: StackTrace, InnerException, Message, HelpLink, HResult, , Source, TargetSiteve Data.

İki veya daha fazla özel durum arasında nedensel bir ilişki olduğunda, InnerException özelliği bu bilgileri korur. Dış özel durum bu iç özel duruma yanıt olarak oluşturulur. Dış özel durumu işleyen kod, hatayı daha uygun şekilde işlemek için önceki iç özel durumdaki bilgileri kullanabilir. Özel durumla ilgili ek bilgiler, özelliğinde Data anahtar/değer çiftleri koleksiyonu olarak depolanabilir.

Özel durum nesnesinin oluşturulması sırasında oluşturucuya geçirilen hata iletisi dizesi yerelleştirilmelidir ve sınıfı kullanılarak bir kaynak dosyasından ResourceManager sağlanabilir. Yerelleştirilmiş kaynaklar hakkında daha fazla bilgi için Uydu Derlemeleri Oluşturma ve Kaynakları Paketleme ve Dağıtma konularına bakın.

Kullanıcıya özel durumun neden oluştuğu hakkında kapsamlı bilgi sağlamak için, özellik bir yardım dosyasının HelpLink URL'sini (veya URN'sini) tutabilir.

sınıfı Exception , değeri 0x80131500 olan HRESULT COR_E_EXCEPTION kullanır.

Sınıfının bir örneğinin ilk özellik değerlerinin Exception listesi için oluşturuculara Exception bakın.

Performansla ilgili önemli noktalar

Özel durum oluşturmak veya işlemek, önemli miktarda sistem kaynağı ve yürütme süresi tüketir. Tahmin edilebilir olayları veya akış denetimini işlemek için değil, yalnızca gerçekten olağanüstü koşulları işlemek için özel durumlar atın. Örneğin, bir sınıf kitaplığı geliştirirken olduğu gibi bazı durumlarda, yönteminizin geçerli parametrelerle çağrılmasını beklediğiniz için, yöntem bağımsız değişkeni geçersizse bir özel durum oluşturmak mantıklıdır. Geçersiz bir yöntem bağımsız değişkeni, kullanım hatasının sonucu değilse, olağanüstü bir şey oluştuğu anlamına gelir. Buna karşılık, kullanıcı girişi geçersizse bir özel durum oluşturmayın, çünkü kullanıcıların bazen geçersiz veri girmesini bekleyebilirsiniz. Bunun yerine, kullanıcıların geçerli giriş girebilmesi için bir yeniden deneme mekanizması sağlayın. Kullanım hatalarını işlemek için özel durumlar da kullanmamalısınız. Bunun yerine, kullanım hatalarını tanımlamak ve düzeltmek için onayları kullanın.

Ayrıca, bir dönüş kodu yeterli olduğunda özel durum oluşturmayın; dönüş kodunu özel duruma dönüştürmeyin; ve düzenli olarak bir özel durum yakalamayın, yoksayın ve işlemeye devam edin.

Özel durum yeniden oluşturma

Çoğu durumda, özel durum işleyicisi yalnızca özel durumu çağırana geçirmek ister. Bu en sık şu durumlarda oluşur:

  • Sırayla çağrıları .NET Framework sınıf kitaplığındaki veya diğer sınıf kitaplıklarındaki yöntemlere sarmalayan bir sınıf kitaplığı.

  • Önemli bir özel durumla karşılaşan bir uygulama veya kitaplık. Özel durum işleyicisi özel durumu günlüğe kaydedebilir ve sonra özel durumu yeniden oluşturabilir.

Bir özel durumu yeniden oluşturmanın önerilen yolu C# dilinde throw deyimini, F# dilinde reraise işlevini ve ifade eklemeden Visual Basic throw deyimini kullanmaktır. Bu, özel durum çağırana yayıldığında tüm çağrı yığını bilgilerinin korunmasını sağlar. Aşağıdaki örnek bunu göstermektedir. dize uzantısı yöntemi, FindOccurrencesbağımsız değişkenlerini önceden doğrulamadan bir veya daha fazla çağrıyı öğesine String.IndexOf(String, Int32) sarmalar.

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

module Library = 
    let findOccurrences (s: string) (f: string) =
        let indexes = ResizeArray()
        let mutable currentIndex = 0
        try
            while currentIndex >= 0 && currentIndex < s.Length do
                currentIndex <- s.IndexOf(f, currentIndex)
                if currentIndex >= 0 then
                    indexes.Add currentIndex
                    currentIndex <- currentIndex + 1
        with :? ArgumentNullException ->
            // Perform some action here, such as logging this exception.
            reraise ()
        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

Arayan daha sonra iki kez arar FindOccurrences . öğesine yapılan ikinci çağrıda FindOccurrences, çağıran arama dizesi olarak bir null geçirir ve bu da yönteminin String.IndexOf(String, Int32) bir ArgumentNullException özel durum oluşturmasına neden olur. Bu özel durum yöntemi tarafından FindOccurrences işlenir ve çağırana geri geçirilir. Throw deyimi ifade olmadan kullanıldığından, örnekteki çıkış çağrı yığınının korunduğunu gösterir.

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

let showOccurrences toFind (indexes: int[]) =
    printf $"'{toFind}' occurs at the following character positions: "
    for i = 0 to indexes.Length - 1 do
        printf $"""{indexes[i]}{if i = indexes.Length - 1 then "" else ", "}"""
    printfn ""

let s = "It was a cold day when..."
let indexes = findOccurrences s "a"
showOccurrences "a" indexes
printfn ""

let toFind: string = null
try
    let indexes = findOccurrences s toFind
    showOccurrences toFind indexes

with :? ArgumentNullException as e ->
    printfn $"An exception ({e.GetType().Name}) occurred."
    printfn $"Message:\n   {e.Message}\n"
    printfn $"Stack Trace:\n   {e.StackTrace}\n"

// 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 'value')
//
//    Stack Trace:
//          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
//    ngComparison comparisonType)
//       at Library.findOccurrences(String s, String f)
//       at <StartupCode$fs>.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 kullanılarak yeniden oluşturulursa

throw e;
Throw e  
raise e

deyimi, tam çağrı yığını korunmaz ve örnek aşağıdaki çıkışı oluşturur:

'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 hantal bir alternatif, yeni bir özel durum oluşturmak ve özgün özel durumun çağrı yığını bilgilerini bir iç özel durumda korumaktır. Daha sonra çağıran, yığın çerçevesini ve özgün özel durum InnerException hakkındaki diğer bilgileri almak için yeni özel durumun özelliğini kullanabilir. Bu durumda throw deyimi şöyledir:

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

Aşağıdaki özel durum işleyicisinde gösterildiği gibi, özel durumu işleyen kullanıcı kodunun InnerException özelliğin özgün özel durum hakkında bilgi içerdiğini bilmesi gerekir.

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
    let indexes = findOccurrences s toFind
    showOccurrences toFind indexes
with :? ArgumentNullException as e ->
    printfn $"An exception ({e.GetType().Name}) occurred."
    printfn $"   Message:\n{e.Message}"
    printfn $"   Stack Trace:\n   {e.StackTrace}"
    let ie = e.InnerException
    if ie <> null then
        printfn "   The Inner Exception:"
        printfn $"      Exception Name: {ie.GetType().Name}"
        printfn $"      Message: {ie.Message}\n"
        printfn $"      Stack Trace:\n   {ie.StackTrace}\n"
// 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çme

Özel durum oluşturmanız gerektiğinde, özel bir özel durum uygulamak yerine genellikle .NET Framework mevcut bir özel durum türünü kullanabilirsiniz. Bu iki koşul altında standart bir özel durum türü kullanmanız gerekir:

  • Bir kullanım hatasının (yani, yönteminizi çağıran geliştirici tarafından yapılan program mantığındaki bir hatanın) neden olduğu bir özel durum oluşturacaksınız. Genellikle , ArgumentNullException, InvalidOperationExceptionveya NotSupportedExceptiongibi ArgumentExceptionbir özel durum oluşturursunuz. Özel durum nesnesinin örneğini oluştururken özel durum nesnesinin oluşturucusunun sağladığınız dize, geliştiricinin düzeltebilmesi için hatayı açıklamalıdır. Daha fazla bilgi için özelliğine Message bakın.

  • Var olan bir .NET Framework özel durumuyla çağırana iletilebilen bir hatayı işliyebilirsiniz. Mümkün olan en türetilmiş özel durumu oluşturmanız gerekir. Örneğin, bir yöntem bir bağımsız değişkenin sabit listesi türünün geçerli bir üyesi olmasını gerektiriyorsa, yerine bir InvalidEnumArgumentException (en çok türetilen sınıf) ArgumentExceptionoluşturmalısınız.

Aşağıdaki tabloda, yaygın özel durum türleri ve bunların hangi koşullar altında oluşturulduğu listelenmiştir.

Özel durum Koşul
ArgumentException Bir yönteme geçirilen null olmayan bir bağımsız değişken geçersiz.
ArgumentNullException Yöntemine geçirilen bir bağımsız değişkendir null.
ArgumentOutOfRangeException Bağımsız değişken geçerli değer aralığının dışındadır.
DirectoryNotFoundException Dizin yolunun bir bölümü geçerli değil.
DivideByZeroException Tamsayı veya Decimal bölme işlemindeki payda sıfırdır.
DriveNotFoundException Bir sürücü kullanılamıyor veya yok.
FileNotFoundException Dosya yok.
FormatException Değer, gibi Parsebir dönüştürme yöntemiyle bir dizeden dönüştürülecek uygun bir biçimde değildir.
IndexOutOfRangeException Dizin, dizi veya koleksiyonun sınırlarının dışındadır.
InvalidOperationException Yöntem çağrısı bir nesnenin geçerli durumunda geçersiz.
KeyNotFoundException Koleksiyondaki bir üyeye erişmek için belirtilen anahtar bulunamıyor.
NotImplementedException Yöntem veya işlem uygulanmaz.
NotSupportedException Yöntem veya işlem desteklenmiyor.
ObjectDisposedException Bir işlem, atılmış bir nesne üzerinde gerçekleştirilir.
OverflowException Aritmetik, atama veya dönüştürme işlemi taşmayla sonuç edilir.
PathTooLongException Yol veya dosya adı, sistem tanımlı uzunluk üst sınırını aşıyor.
PlatformNotSupportedException İşlem geçerli platformda desteklenmiyor.
RankException Yanlış sayıda boyuta sahip bir dizi bir yönteme geçirilir.
TimeoutException Bir işleme ayrılan zaman aralığının süresi doldu.
UriFormatException Geçersiz bir Tekdüzen Kaynak Tanımlayıcısı (URI) kullanılıyor.

Özel durum uygulama

Aşağıdaki durumlarda, bir hata koşulunu işlemek için mevcut bir .NET Framework özel durumunu kullanmak yeterli değildir:

  • Özel durum, var olan bir .NET Framework özel durumuyla eşlenemeyen benzersiz bir program hatası yansıttığında.

  • Özel durum, var olan bir .NET Framework özel durumu için uygun işlemeden farklı bir işleme gerektirdiğinde veya özel durumun benzer bir özel durumdan ayrılmış olması gerektiğinde. Örneğin, hedef tam sayı türünün aralığı dışında olan bir dizenin sayısal gösterimini ayrıştırırken özel ArgumentOutOfRangeException durum oluşturursanız, çağıranın yöntemi çağırırken uygun kısıtlanmış değerleri sağlamamasından kaynaklanan bir hata için aynı özel durumu kullanmak istemezsiniz.

Exception sınıfı, .NET Framework tüm özel durumların temel sınıfıdır. Birçok türetilmiş sınıf, sınıfın üyelerinin devralınan Exception davranışına güvenir; üyelerini Exceptiongeçersiz kılmaz veya benzersiz üye tanımlamaz.

Kendi özel durum sınıfınızı tanımlamak için:

  1. öğesinden Exceptiondevralan bir sınıf tanımlayın. Gerekirse, özel durum hakkında ek bilgi sağlamak için sınıfınızın ihtiyaç duyduğu tüm benzersiz üyeleri tanımlayın. Örneğin, sınıfı bağımsız ArgumentException değişkeni özel duruma neden olan parametrenin adını belirten bir ParamName özellik içerir ve RegexMatchTimeoutException özelliği zaman aşımı aralığını belirten bir MatchTimeout özellik içerir.

  2. Gerekirse, işlevselliğini değiştirmek veya değiştirmek istediğiniz devralınan üyeleri geçersiz kılın. Varolan türetilmiş sınıfların Exception çoğunun devralınan üyelerin davranışını geçersiz kılmadığını unutmayın.

  3. Özel özel durum nesnenizin serileştirilebilir olup olmadığını belirleyin. Seri hale getirme, özel durum hakkındaki bilgileri kaydetmenizi sağlar ve uzaktan iletişim bağlamında bir sunucu ve istemci proxy'si tarafından özel durum bilgilerinin paylaşılmasına izin verir. Özel durum nesnesini seri hale getirmek için özniteliğiyle SerializableAttribute işaretleyin.

  4. Özel durum sınıfınızın oluşturucularını tanımlayın. Genellikle, özel durum sınıflarının aşağıdaki oluşturuculardan biri veya daha fazlası vardır:

    • Exception(), yeni bir özel durum nesnesinin özelliklerini başlatmak için varsayılan değerleri kullanır.

    • Exception(String), belirtilen hata iletisiyle yeni bir özel durum nesnesi başlatır.

    • Exception(String, Exception), belirtilen hata iletisi ve iç özel durum ile yeni bir özel durum nesnesi başlatır.

    • Exception(SerializationInfo, StreamingContext), serileştirilmiş verilerden yeni bir özel durum nesnesi başlatan bir protected oluşturucudur. Özel durum nesnenizi seri hale getirmeyi seçtiyseniz bu oluşturucuyu uygulamanız gerekir.

Aşağıdaki örnekte özel bir özel durum sınıfının kullanımı gösterilmektedir. İstemci, asal olmayan bir NotPrimeException başlangıç numarası belirterek bir dizi asal sayı almaya çalıştığında oluşan bir özel durum tanımlar. Özel durum, NonPrimeözel duruma neden olan asal olmayan bir sayı döndüren yeni bir özelliği tanımlar. Sınıf, korumalı bir parametresiz oluşturucu ve serileştirme için ve parametreleriyle SerializationInfo bir oluşturucu uygulamanın yanı sıra, NotPrimeException özelliğini desteklemek NonPrime için üç ek oluşturucu StreamingContext tanımlar. Her oluşturucu, asal olmayan sayının değerini korumaya ek olarak bir temel sınıf oluşturucuyu çağırır. sınıfı NotPrimeException özniteliğiyle SerializableAttribute de işaretlenir.

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; } }
}
namespace global

open System
open System.Runtime.Serialization

[<Serializable>]
type NotPrimeException = 
    inherit Exception
    val notAPrime: int

    member this.NonPrime =
        this.notAPrime

    new (value) =
        { inherit Exception($"%i{value} is not a prime number."); notAPrime = value }

    new (value, message) =
        { inherit Exception(message); notAPrime = value }

    new (value, message, innerException: Exception) =
        { inherit Exception(message, innerException); notAPrime = value }

    // F# does not support protected members
    new () = 
        { inherit Exception(); notAPrime = 0 }

    new (info: SerializationInfo, context: StreamingContext) =
        { inherit Exception(info, context); notAPrime = 0 }
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

PrimeNumberGenerator Aşağıdaki örnekte gösterilen sınıf, sınıf oluşturucusunun çağrısında istemci tarafından belirtilen sınıra kadar olan asal sayıların sırasını hesaplamak için Eratosthenes'in Sieve'sini kullanır. yöntemi, GetPrimesFrom belirtilen alt sınırdan büyük veya bu sınıra eşit olan tüm asal sayıları döndürür, ancak bu alt sınır bir asal sayı değilse bir NotPrimeException oluşturur.

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

open System

[<Serializable>]
type PrimeNumberGenerator(upperBound) =
    let start = 2
    let maxUpperBound = 10000000
    let primes = ResizeArray()
    let primeTable = 
        upperBound + 1
        |> Array.zeroCreate<bool>

    do
        if upperBound > maxUpperBound then
            let message = $"{upperBound} exceeds the maximum upper bound of {maxUpperBound}."
            raise (ArgumentOutOfRangeException message)
        
        // Create array and mark 0, 1 as not prime (True).
        primeTable[0] <- true
        primeTable[1] <- true

        // Use Sieve of Eratosthenes to determine prime numbers.
        for i = start to float upperBound |> sqrt |> ceil |> int do
            if not primeTable[i] then
                for multiplier = i to upperBound / i do
                    if i * multiplier <= upperBound then
                        primeTable[i * multiplier] <- true
        
        // Populate array with prime number information.
        let mutable index = start
        while index <> -1 do
            index <- Array.FindIndex(primeTable, index, fun flag -> not flag)
            if index >= 1 then
                primes.Add index
                index <- index + 1

    member _.GetAllPrimes() =
        primes.ToArray()

    member _.GetPrimesFrom(prime) =
        let start = 
            Seq.findIndex ((=) prime) primes
        
        if start < 0 then
            raise (NotPrimeException(prime, $"{prime} is not a prime number.") )
        else
            Seq.filter ((>=) prime) primes
            |> Seq.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, yöntemine GetPrimesFrom asal olmayan numaralarla iki çağrı yapar ve bunlardan biri uygulama etki alanı sınırlarını aşıyor. Her iki durumda da özel durum oluşturulur ve istemci kodunda başarıyla işlenir.

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

let limit = 10000000
let primes = PrimeNumberGenerator limit
let start = 1000001
try
    let values = primes.GetPrimesFrom start
    printfn $"There are {values.Length} prime numbers from {start} to {limit}"
with :? NotPrimeException as e ->
    printfn $"{e.NonPrime} is not prime"
    printfn $"{e}"
    printfn "--------"

let domain = AppDomain.CreateDomain "Domain2"
let gen = 
    domain.CreateInstanceAndUnwrap(
        typeof<PrimeNumberGenerator>.Assembly.FullName,
        "PrimeNumberGenerator", true,
        BindingFlags.Default, null,
        [| box 1000000 |], null, null)
    :?> PrimeNumberGenerator
try
    let start = 100
    printfn $"{gen.GetPrimesFrom start}"
with :? NotPrimeException as e ->
    printfn $"{e.NonPrime} is not prime"
    printfn $"{e}"
    printfn "--------"
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

Windows 8 için Windows 8.x Store uygulamaları için .NET'te, .NET Framework olmayan yığın çerçeveleri aracılığıyla bir özel durum yayıldığında bazı özel durum bilgileri genellikle kaybolur. .NET Framework 4.5.1 ve Windows 8.1'dan başlayarak, özel durum .NET Framework olmayan bir yığın çerçevesinde değiştirilmediği sürece ortak dil çalışma zamanı, oluşan özgün Exception nesneyi kullanmaya devam eder.

Oluşturucular

Exception()

Exception sınıfının yeni bir örneğini başlatır.

Exception(SerializationInfo, StreamingContext)

Exception sınıfının yeni bir örneğini serileştirilmiş verilerle başlatır.

Exception(String)

Belirtilen hata iletisiyle sınıfının yeni bir örneğini Exception başlatır.

Exception(String, Exception)

Belirtilen bir hata iletisi ve bu özel durumun nedeni olan iç özel duruma başvuru ile sınıfının yeni bir örneğini Exception başlatır.

Özellikler

Data

Özel durum hakkında kullanıcı tanımlı ek bilgiler sağlayan bir anahtar/değer çifti koleksiyonu alır.

HelpLink

Bu özel durumla ilişkili yardım dosyasının bağlantısını alır veya ayarlar.

HResult

Belirli bir özel duruma atanan kodlanmış sayısal bir değer olan HRESULT değerini alır veya ayarlar.

InnerException

Exception Geçerli özel duruma neden olan örneği alır.

Message

Geçerli özel durumu açıklayan bir ileti alır.

Source

Hataya neden olan uygulamanın veya nesnenin adını alır veya ayarlar.

StackTrace

Çağrı yığınındaki anlık çerçevelerin dize gösterimini alır.

TargetSite

Geçerli özel durumu oluşturan yöntemini alır.

Yöntemler

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

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

Türetilmiş bir sınıfta geçersiz kılındığında, sonraki bir veya daha fazla özel durumun kök nedeni olan değerini döndürür Exception .

GetHashCode()

Varsayılan karma işlevi işlevi görür.

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

Türetilmiş bir sınıfta geçersiz kılındığında, özel durum hakkındaki bilgilerle öğesini ayarlar SerializationInfo .

GetType()

Geçerli örneğin çalışma zamanı türünü alır.

GetType()

Type Geçerli örneğini alır.

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

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

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

Geçerli özel durumun dize gösterimini oluşturur ve döndürür.

Ekinlikler

SerializeObjectState
Kullanımdan kalktı.

Bir özel durum, özel durum hakkında serileştirilmiş veriler içeren bir özel durum nesnesi oluşturmak üzere seri hale getirildiğinde gerçekleşir.

Şunlara uygulanır

Ayrıca bkz.