Cevabın EVET olduğuna neredeyse pozitifim. Bir Sonunda Dene bloğu kullanırsam, ancak bir Catch bloğu kullanmazsam, herhangi bir istisna OLACAKTIR. Doğru?
Genel olarak uygulama hakkında herhangi bir fikriniz var mı?
Seth
Cevabın EVET olduğuna neredeyse pozitifim. Bir Sonunda Dene bloğu kullanırsam, ancak bir Catch bloğu kullanmazsam, herhangi bir istisna OLACAKTIR. Doğru?
Genel olarak uygulama hakkında herhangi bir fikriniz var mı?
Seth
Yanıtlar:
Evet, kesinlikle olacak. Bloğunuzun finally
bir istisna atmadığını varsayarsak , elbette, bu durumda, başlangıçta atılan bloğu etkin bir şekilde "değiştirecektir".
Genel olarak uygulama hakkında herhangi bir fikriniz var mı?
Evet. Dikkatli ol . Nihai bloğunuz çalışırken, işlenmemiş, beklenmedik bir istisna atıldığı için çalışması tamamen mümkündür . Bu, bir şeyin kırıldığı ve tamamen beklenmedik bir şeyin olabileceği anlamına gelir .
Bu durumda, muhtemelen son bloklarda kodu çalıştırmamanız gerekir. Nihayet bloğundaki kod, bağlı olduğu alt sistemlerin sağlıklı olduğunu varsaymak için oluşturulabilir, ancak aslında derinlemesine kırılabilirler. Nihayet bloğundaki kod işleri daha da kötüleştirebilir.
Örneğin, sık sık bu tür şeyler görüyorum:
DisableAccessToTheResource();
try
{
DoSomethingToTheResource();
}
finally
{
EnableAccessToTheResource();
}
Bu kodun yazarı, "Dünyanın durumuna geçici bir mutasyon yapıyorum; devleti bana çağrılmadan önceki haline getirmem gerekiyor" diye düşünüyor. Ama bunun ters gidebileceği tüm yolları düşünelim.
İlk olarak, kaynağa erişim arayan tarafından zaten devre dışı bırakılmış olabilir; bu durumda, bu kod, muhtemelen vaktinden önce yeniden etkinleştirir.
İkincisi, DoSomethingToTheResource bir istisna atarsa, kaynağa erişimi etkinleştirmek için yapılacak doğru şey budur ??? Kaynağı yöneten kod beklenmedik şekilde bozuldu . Bu kod, aslında "yönetim kodu bozulursa, diğer kodun da bu bozuk kodu en kısa sürede çağırabildiğinden emin olun, böylece korkunç bir şekilde başarısız olabilir " diyor. Bu kötü bir fikir gibi görünüyor.
Üçüncü olarak, DoSomethingToTheResource bir istisna atarsa, EnableAccessToTheResource'un da bir istisna oluşturmayacağını nasıl bileceğiz? Kaynağın kullanımı ne kadar kötü olursa olsun temizleme kodunu da etkileyebilir, bu durumda orijinal istisna kaybolacak ve sorunun teşhis edilmesi daha zor olacaktır.
Sonunda dene bloklarını kullanmadan böyle kod yazma eğilimindeyim:
bool wasDisabled = IsAccessDisabled();
if (!wasDisabled)
DisableAccessToTheResource();
DoSomethingToTheResource();
if (!wasDisabled)
EnableAccessToTheResource();
Artık devlet, olması gerekmedikçe mutasyona uğramaz. Arayanın durumu artık karışık değil. Ve şimdi, DoSomethingToTheResource başarısız olursa, erişimi yeniden etkinleştirmeyiz. Bir şeyin derinlemesine bozuk olduğunu varsayıyoruz ve kodu çalıştırmaya devam ederek durumu daha da kötüleştirme riskini almayız. Mümkünse, arayanın sorunla ilgilenmesine izin verin.
Öyleyse nihayet bloğu çalıştırmak ne zaman iyi bir fikirdir? İlk olarak, istisna beklendiğinde. Örneğin, başka biri kilitlediği için bir dosyayı kilitleme girişiminin başarısız olmasını bekleyebilirsiniz. Bu durumda istisnayı yakalamak ve kullanıcıya bildirmek mantıklıdır. Bu durumda neyin kırıldığına dair belirsizlik azalır; temizlik yaparak işleri daha da kötüleştirmeniz olası değildir.
İkincisi, temizlediğiniz kaynak kıt bir sistem kaynağı olduğunda. Örneğin, bir nihayet bloğundaki bir dosya tutamacını kapatmak mantıklıdır. ("Kullanmak" elbette bir dene-son bloğu yazmanın başka bir yoludur.) Dosyanın içeriği bozulmuş olabilir, ancak şimdi bununla ilgili yapabileceğiniz hiçbir şey yok. Dosya tanıtıcısı er ya da geç kapatılacak, bu yüzden daha sonra değil de daha erken olabilir.