İç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?
İç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?
Yanıtlar:
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.
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.
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
Çünkü nihayet bir catch bloğunda istisna işlemeseniz bile idam edilecek.
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
}
finally
, de olduğu gibi:
try {
// do something risky
} catch (Exception ex) {
// handle an exception
} finally {
// do any required cleanup
}
try..catch
try 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.
sonunda bir dosya okuyucu istisna ile kullanımını açıklayacağım Örnek
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();
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.
İ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.
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
}
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.
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.
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
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 finally
cümle içinde yer alan kodun , bir önceki catch
cümlenin return
ifadesi olsa bile yürütüleceği açıktır .