Sonunda neden C # kullanıyorsunuz?


189

İçinde ne varsa, nihayet bloklar her zaman (neredeyse) yürütülür, bu yüzden kodu içine yerleştirmek veya kapalı bırakmak arasındaki fark nedir?


3
Kapatılmadan bırakarak ne demek istiyorsun?
Ramesh

5
Ve "(neredeyse)" ile ne demek istiyorsun?
Beska

49
Bir makine bir deneme yan tümcesi yürütürken güç kablosunu çekerseniz, son yan tümce tümce çağrılmaz.
Dour High Arch

5
lol, evet, bu doğru, ama bunu gerçekten kodlayamazsın?
Ed S.

2
@Ed: İşlemleri kullanın. Deneme cümleniz, nihayet bendinde tek, atomik bir değişimle devam edebilecek bir tür geçici veya bellek içi değişiklik yapmak zorundadır. Bu nadiren kolaydır ve özel donanım gerektirebilir.
Dour High Arch

Yanıtlar:


405

Sonunda bir blok içindeki kod, bir istisna olup olmadığına bakılmaksızın yürütülür. Bu, her zaman kapatma bağlantıları gibi çalıştırmanız gereken belirli temizlik işlevleri söz konusu olduğunda çok kullanışlıdır.

Şimdi, sorunuzun bunu neden yapmanız gerektiğini tahmin ediyorum :

try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}

Bunu ne zaman yapabilirsiniz:

try
{
    doSomething();
}
catch
{
    catchSomething();
}

alwaysDoThis();

Cevap, catch ifadenizin içindeki kodun bir çok kez ya bir istisnayı yeniden ya da geçerli fonksiyondan çıkmasıdır. İkinci kodla "alwaysDoThis ();" catch deyiminin içindeki kod bir dönüş verirse veya yeni bir istisna atarsa ​​çağrı yürütülmez.


3
Hmm. Söylediklerime çok benzer, ancak daha net ve daha kesin. Kesin +1.
Beska

46
bu, try {} bloğunun içindeki "return" için de geçerlidir.
Lucas

4
aslında, bir catch {} bloğu olmadan bile geçerlidir (sadece deneyin / son olarak, istisnaların patlamasına izin verin)
Lucas

benimkinden daha iyi, işteydi ve on dakika ayrıntılı olarak cevaplamak istemiyordu. +1
Matt Briggs

2
Evet, aklımda olan buydu: D Şimdi anlıyorum.
Rodrigo

62

Try-nihayet kullanmanın en avantajları zaten belirtildi, ancak bunu ekleyeceğimi düşündüm:

try
{
    // Code here that might throw an exception...

    if (arbitraryCondition)
    {
        return true;
    }

    // Code here that might throw an exception...
}
finally
{
    // Code here gets executed regardless of whether "return true;" was called within the try block (i.e. regardless of the value of arbitraryCondition).
}

Bu davranış bir olsa, temizleme (atmayın kaynaklar) gerçekleştirmek için gereken özellikle, çeşitli durumlarda çok kullanışlı hale kullanarak blok genellikle daha bu durumda olduğunu.


2
Sonunda kullanmamın tek nedeni bu
Christopher Townsend

12

akış okuyucuları, db istekleri vb. gibi yönetilmeyen kod isteklerini her kullandığınızda; ve istisna yakalamak istiyorsanız sonra nihayet yakalamak deneyin ve sonunda akışı, veri okuyucu, vb kapatın, eğer hatalar yapmazsanız bağlantı kapanmaz, bu db istekleri ile gerçekten kötü

 SqlConnection myConn = new SqlConnection("Connectionstring");
        try
        {
            myConn.Open();
            //make na DB Request                
        }
        catch (Exception DBException)
        {
            //do somehting with exception
        }
        finally
        {
           myConn.Close();
           myConn.Dispose();
        }

hatayı yakalamak istemiyorsanız

 using (SqlConnection myConn = new SqlConnection("Connectionstring"))
        {
            myConn.Open();
            //make na DB Request
            myConn.Close();
        }

ve bir hata varsa bağlantı nesnesi otomatik olarak atılır, ancak hatayı yakalamazsanız


2
Dispose () de bağlantıyı kapatır (), her ikisini de aramanıza gerek yoktur. Close (), Dipose () işlevini DEĞİLDİR, bağlantıyı yeniden açabilirsiniz.
Lucas

Güzel, kullandığınız için teşekkür ederiz. Yoksa cevap vermeliydim.
Dan Rosenstark

11

Çünkü nihayet bir catch bloğunda istisna işlemeseniz bile idam edilecek.


7

Sonunda ifadeler dönüşten sonra bile çalıştırılabilir.

private int myfun()
{
    int a = 100; //any number
    int b = 0;
    try
    {
        a = (5 / b);
        return a;
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
        return a;
    }

 //   Response.Write("Statement after return before finally");  -->this will give error "Syntax error, 'try' expected"
    finally
    {
      Response.Write("Statement after return in finally"); // --> This will execute , even after having return code above
    } 

    Response.Write("Statement after return after finally");  // -->Unreachable code
}

7

finally, de olduğu gibi:

try {
  // do something risky
} catch (Exception ex) {
  // handle an exception
} finally {
  // do any required cleanup
}

try..catchtry bloğunuzun bir istisna oluşturup atmadığına bakılmaksızın, bloğunuzdan sonra kodu yürütmek için garantili bir fırsattır .

Bu, kaynakları serbest bırakma, db bağlantıları, dosya tanıtıcıları vb.


3
Bu örneklerin tümü tipik olarak bir kullanım bloğu ile daha iyi sunulur, ancak bu cevabınızı gerçekten etkilemez.
Joel Coehoorn

4

sonunda bir dosya okuyucu istisna ile kullanımını açıklayacağım Örnek

  • sonunda kullanarak
try{

  StreamReader strReader = new StreamReader(@"C:\Ariven\Project\Data.txt");
  Console.WriteLine(strReader.ReadeToEnd());
  StreamReader.Close();
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}

yukarıdaki örnekte Data.txt adlı dosya eksikse, bir istisna atılır ve işlenir, ancak çağrılan ifade hiçbir zaman yürütülmez. Bu nedenle okuyucu ile ilgili kaynaklar hiç yayınlanmadı.StreamReader.Close();

  • Yukarıdaki sorunu çözmek için sonunda kullanıyoruz
StreamReader strReader = null;
try{
    strReader = new StreamReader(@"C:\Ariven\Project\Data.txt");
    Console.WriteLine(strReader.ReadeToEnd());
}
catch (Exception ex){
    Console.WriteLine(ex.Message);
}
finally{
    if (strReader != null){
        StreamReader.Close();
    }
}

Mutlu Kodlama :)

Not: "@", "Tanınmayan kaçış dizisi" hatalarından kaçınmak için kelimesi kelimesine bir dize oluşturmak için kullanılır . @ Sembolü bu dizeyi kelimenin tam anlamıyla okumak ve kontrol karakterlerini başka şekilde yorumlamamak anlamına gelir.


2

İmleci, bekleme (kum saati) imleci yerine varsayılan işaretçiye ayarlamanız gerektiğini varsayalım. İmleci ayarlamadan önce bir istisna atılırsa ve uygulamayı açıkça çökmezse, kafa karıştırıcı bir imleçle bırakabilirsiniz.


2

Bazen bir istisna (catch bloğu yok) işlemek istemezsiniz, ancak bazı temizleme kodlarının yürütülmesini istersiniz.

Örneğin:

try
{
    // exception (or not)
}
finally
{
    // clean up always
}

İstisna yakalanmazsa, nihayet bloğun yürütülmesi, işletim sisteminin bir istisna çözme işlemini tetiklemeyi seçip seçmediğine bağlıdır.
Vikas Verma

2

Son olarak blok , try bloğunda tahsis edilen kaynakları temizlemek ve bir istisna olsa bile çalıştırılması gereken herhangi bir kodu çalıştırmak için değerlidir. Deneme bloğunun nasıl çıktığından bağımsız olarak kontrol her zaman son bloğa geçirilir.


1

Ahh ... Sanırım ne dediğini anlıyorum! Bana bir saniye sürdü ... "sonunda nihayet blok yerine nihayet bloğa yerleştir ve try-catch-nihayetin tamamen dışında" diye merak ediyorsun.

Örnek olarak, bir hata atarsanız yürütmeyi durdurmanız, ancak yine de açık dosyalar, veritabanı bağlantıları vb. Gibi kaynakları temizlemek istemeniz olabilir.


1

Nihayet Bloğun Kontrol Akışı ya Try ya da Catch bloğundan sonra gelir.

[1. First Code]
[2. Try]
[3. Catch]
[4. Finally]
[5. After Code]

İstisna 1> 2> 3> 4> 5 ile 3'ün bir İade ifadesi varsa 1> 2> 3> 4

İstisnasız 1> 2> 4> 5, 2'nin bir iade ifadesi varsa 1> 2> 4


0

Belgelerde belirtildiği gibi :

Yakalama ve son olarak birlikte kullanılan ortak bir kullanım, bir deneme bloğundaki kaynakları elde etmek ve kullanmak, bir yakalama bloğundaki istisnai durumlarla başa çıkmak ve sonunda bloktaki kaynakları serbest bırakmaktır.

Ayrıca okunmaya değerdir bu devletler, hangi:

Eşleşen bir catch cümlesi bulunduğunda, sistem kontrolü catch maddesinin ilk ifadesine aktarmaya hazırlanır. Catch yan tümcesinin yürütülmesi başlamadan önce, sistem ilk olarak, son olarak try deyimleriyle ilişkilendirilmiş tüm yan tümceleri, istisnayı yakalayandan daha içiçe yerleştirir.

Dolayısıyla, bir finallycümle içinde yer alan kodun , bir önceki catchcümlenin returnifadesi olsa bile yürütüleceği açıktır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.