Aracılığıyla paylaş


try-catch (C# Reference)

Try-catch deyimi oluşan bir try ardından bir veya daha fazla tarafından bloğu catch yan tümceleri farklı durumlar için işleyiciler belirleyin.

Notlar

Bir özel durum oluştuğunda, ortak dil çalışma zamanı (clr) arar catch bu özel durum işleme ifadesi. Şu anda yürütülen yöntemi gibi içermiyorsa, bir catch engellemek, geçerli yöntemi, vb. çağrı yığını olarak adlandırılan yöntem clr bakar. Hiç catch blok bulunduğunda, ardından clr kullanıcıya işlenmeyen özel durum iletisi görüntülenir ve program çalışmasını durdurur.

try Blok özel durumuna neden olabilir guarded kodu içerir. Blok başarıyla tamamlandı ya da bir özel durum kadar yürütülür. Örneğin, aşağıdaki atama girişimi bir null nesne harekete geçirirse NullReferenceException özel durum:

object o2 = null;
try
{
    int i2 = (int)o2;   // Error
}

Ancak catch yan tümcesi bağımsız herhangi bir türdeki özel durumu yakalayacak için kullanılabilir, bu kullanımı önerilmez. Genel olarak, sadece nasıl kurtarılır bildiğiniz bu özel durumları yakalamak. Bu nedenle, her zaman'den türetilen nesnenin bağımsız değişkeni belirtmelisiniz System.Exception örneğin:

catch (InvalidCastException e) 
{
}

Birden fazla özel kullanmak mümkündür catch yan tümcesinde aynı try-catch deyimi. Bu durumda, siparişi catch yan tümceleri önemlidir çünkü catch yan tümceleri sırayla incelenir. Daha özel durumları önce daha az belirgin olanları yakalamak. Böylece bir sonraki blok asla ulaşılamayacak, catch engeller sipariş, derleyici bir hata üretir.

A durum ifadesi kullanılabilmesi için bir catch bloğu tarafından yakalanıp istisnayı catch ifadesi. Aşağıdaki örnek, kaynak bilgilerini ayıklar bir IOException özel durumu ve sonra üst yöntemine istisna atar.

catch (FileNotFoundException e)
{
    // FileNotFoundExceptions are handled here.
}
catch (IOException e)
{
    // Extract some information from this exception, and then 
    // throw it to the parent method.
    if (e.Source != null)
        Console.WriteLine("IOException source: {0}", e.Source);
    throw;
}

Tek özel durum yakalamak ve farklı bir özel durum. Bunu yaptığınızda, aşağıdaki örnekte gösterildiği gibi iç özel durum Yakalanan özel durumu belirtin.

catch (InvalidCastException e) 
{
    // Perform some action here, and then throw a new exception.
    throw new YourCustomException("Put your error message here.", e);
}

Belirtilen bir koşul doğru aşağıdaki örnekte gösterildiği gibi olduğunda, aynı zamanda bir istisnayı.

catch (InvalidCastException e)
{
    if (e.Data == null)
    {
        throw;
    }
    else
    {
        // Take some action.
    }
 }

Gelen içinde bir try engellemek, içerisindeki bildirilen değişkenleri başlatılamıyor. Aksi takdirde, yürütme bloğunun tamamlanmadan önce özel bir durum ortaya çıkabilir. Örneğin, aşağıdaki kod örneğinde, değişken, n içinde başlatılan try blok. Bu değişken dışında kullanma girişimi try engellemek Write(n) ifadesi bir derleyici hatası oluşturur.

static void Main() 
{
    int n;
    try 
    {
        // Do not initialize this variable here.
        n = 123;
    }
    catch
    {
    }
    // Error: Use of unassigned local variable 'n'.
    Console.Write(n);
}

Catch hakkında daha fazla bilgi için bkz: try-catch-finally.

Özel durumlar, zaman uyumsuz yöntemleri

Zaman uyumsuz yöntem olarak işaretlenmiş bir zaman uyumsuz değiştirici ve genellikle içerir veya deyimlerde ya da ifadelerde daha bekler. Await deyim geçerli await operatör için bir Task veya Task<TResult>. Bir await ifade gerçekleştirilemez bir catch blok veya bir finally blok.

Ne zaman, en fazla kontrol bir await awaited görev tamamlanıncaya kadar zaman uyumsuz yönteminde yöntem sürüyor askıya alınır. Görev tamamlandığında, yürütme yönteminde devam edebilirsiniz. Daha fazla bilgi için, bkz. Zaman uyumsuz zaman uyumsuz programlama ve beklemek (C# ve Visual Basic) ve Denetim akışında zaman uyumsuz programlar (C# ve Visual Basic).

Tamamlanmış görev hangi await uygulanan görev döndüren yöntemi işlenmeyen bir özel durum nedeniyle hatalı bir durumda olabilir. Görev bekleyen bir istisna atar. Verdiği zaman uyumsuz işlem iptal edilirse bir görev de iptal edilmiş durumda sonunun. İptal edilen görev bekleyen atar bir OperationCanceledException. Bir zaman uyumsuz işlem iptal etme hakkında daha fazla bilgi için bkz: Async Uygulamanızda Hassas Ayar Yapma (C# ve Visual Basic).

Özel durumu yakalamak için de görevi beklemek bir try engellemek ve özel durumla ilişkili catch catch blok. Örneğin, "Örnek" bölümüne bakın.

Awaited zaman uyumsuz yöntem birden çok özel durumlar oluştu çünkü hatalı bir durumda bir görev olabilir. Örneğin, görev çağrısı sonucunda oluşabilecek Task.WhenAll. Böyle bir görev bekler, yalnızca bir özel durum yakalandı ve özel durum yakalandı tahmin edemezsiniz. Örneğin, "Örnek" bölümüne bakın.

Örnek

Aşağıdaki örnekte, try bloğu içeren bir çağrı ProcessString yöntemi bir özel durum neden olabilir. catch Yan tümcesi yalnızca ekranda bir ileti görüntüler özel durum işleyicisi içerir. Zaman throw ifade olarak adlandırılır içinde MyMethod, sistem arar catch ifadesi ve iletiyi görüntüler Exception caught.

    class TryFinallyTest
{
    static void ProcessString(string s)
    {
        if (s == null)
        {
            throw new ArgumentNullException();
        }
    }

    static void Main()
    {
        string s = null; // For demonstration purposes.

        try
        {            
            ProcessString(s);
        }

        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
    }
}
    /*
    Output:
    System.ArgumentNullException: Value cannot be null.
       at TryFinallyTest.Main() Exception caught.
     * */

Aşağıdaki örnekte, iki catch bloklar kullanılır ve ilk gelen, en özel özel durum yakalandı.

En az belirgin özel durumu yakalamak için throw deyimini değiştirebilirsiniz ProcessString şu ifadeyle: throw new Exception().

Örnekte ilk önce en az özel catch bloğu koyarsanız, aşağıdaki hata iletisi görüntülenir: A previous catch clause already catches all exceptions of this or a super type ('System.Exception').

class ThrowTest3
{
    static void ProcessString(string s)
    {
        if (s == null)
        {
            throw new ArgumentNullException();
        }
    }

    static void Main()
    {
        try
        {
            string s = null;
            ProcessString(s);
        }
        // Most specific:
        catch (ArgumentNullException e)
        {
            Console.WriteLine("{0} First exception caught.", e);
        }
        // Least specific:
        catch (Exception e)
        {
            Console.WriteLine("{0} Second exception caught.", e);
        }
    }
}
/*
 Output:
 System.ArgumentNullException: Value cannot be null.
 at Test.ThrowTest3.ProcessString(String s) ... First exception caught.
*/

Aşağıdaki örnek, özel durum işleme için zaman uyumsuz yöntemleri gösterir. Zaman uyumsuz bir görev oluşturduğunda bir özel durumu yakalamak için koyun await ifadede bir try engellemek ve içinde özel durumu yakalar bir catch blok.

Açıklama karakterlerini kaldırın throw new Exception özel durum işleme göstermek için örnekteki satır. Görevin IsFaulted özelliği True, görevin Exception.InnerException özel özelliğini ayarlayın ve özel durum yakalandı catch blok.

Açıklama karakterlerini kaldırın throw new OperationCancelledException ne olacağını göstermek için bir satır tıklattığınızda, zaman uyumsuz işlem cancelan. Görevin IsCanceled özelliği true, ve özel durum yakalandı catch blok. Bu örnek için görev 's uygulanmaz bazı koşullar altında IsFaulted özelliği true ve IsCanceled ayarlamak false.

        public async Task DoSomethingAsync()
        {
            Task<string> theTask = DelayAsync();

            try
            {
                string result = await theTask;
                Debug.WriteLine("Result: " + result);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception Message: " + ex.Message);
            }
            Debug.WriteLine("Task IsCanceled: " + theTask.IsCanceled);
            Debug.WriteLine("Task IsFaulted:  " + theTask.IsFaulted);
            if (theTask.Exception != null)
            {
                Debug.WriteLine("Task Exception Message: "
                    + theTask.Exception.Message);
                Debug.WriteLine("Task Inner Exception Message: "
                    + theTask.Exception.InnerException.Message);
            }
        }

        private async Task<string> DelayAsync()
        {
            await Task.Delay(100);

            // Uncomment each of the following lines to
            // demonstrate exception handling.

            //throw new OperationCanceledException("canceled");
            //throw new Exception("Something happened.");
            return "Done";
        }

        // Output when no exception is thrown in the awaited method:
        //   Result: Done
        //   Task IsCanceled: False
        //   Task IsFaulted:  False

        // Output when an Exception is thrown in the awaited method:
        //   Exception Message: Something happened.
        //   Task IsCanceled: False
        //   Task IsFaulted:  True
        //   Task Exception Message: One or more errors occurred.
        //   Task Inner Exception Message: Something happened.

        // Output when a OperationCanceledException or TaskCanceledException
        // is thrown in the awaited method:
        //   Exception Message: canceled
        //   Task IsCanceled: True
        //   Task IsFaulted:  False

Aşağıdaki örnek, özel durum işleme burada birden çok görevi birden çok özel duruma neden olabilir gösterir. try Blok bekler yapılan bir çağrı tarafından döndürülen görev Task.WhenAll. WhenAll uygulandığı üç görevi tamamladığınızda, görev tamamlanmıştır.

Her üç görev, bir özel durum oluşur. catch Blok dolaşır bulunan özel durumlar aracılığıyla Exception.InnerExceptions özelliği tarafından döndürülen görev Task.WhenAll.

public async Task DoMultipleAsync()
{
    Task theTask1 = ExcAsync(info: "First Task");
    Task theTask2 = ExcAsync(info: "Second Task");
    Task theTask3 = ExcAsync(info: "Third Task");

    Task allTasks = Task.WhenAll(theTask1, theTask2, theTask3);

    try
    {
        await allTasks;
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Exception: " + ex.Message);
        Debug.WriteLine("Task IsFaulted: " + allTasks.IsFaulted);
        foreach (var inEx in allTasks.Exception.InnerExceptions)
        {
            Debug.WriteLine("Task Inner Exception: " + inEx.Message);
        }
    }
}

private async Task ExcAsync(string info)
{
    await Task.Delay(100);

    throw new Exception("Error-" + info);
}

// Output:
//   Exception: Error-First Task
//   Task IsFaulted: True
//   Task Inner Exception: Error-First Task
//   Task Inner Exception: Error-Second Task
//   Task Inner Exception: Error-Third Task

C# dil belirtimi

Daha fazla bilgi için bkz: C# dil belirtiminin. Dil belirtimi, C# sözdizimi ve kullanımı için nihai kaynaktır.

Ayrıca bkz.

Görevler

Nasıl yapılır: açıkça istisna atar

Başvuru

C# anahtar sözcükler

deneyin, catch ve throw ifadelerini (C++)

Özel durum işleme ifadeleri (C# Reference)

throw (C# Reference)

try-finally (C# Reference)

Kavramlar

C# Programlama Kılavuzu

Diğer Kaynaklar

C# Başvurusu