Bir deneme yakalama bloğu içinden dönmek kötü bir uygulama mı?


128

Bu yüzden bu sabah şuna benzeyen bir kodla karşılaştım:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Şimdi bu kod iyi bir şekilde derleniyor ve olması gerektiği gibi çalışıyor, ancak bir try bloğunun içinden dönmek doğru gelmiyor, özellikle de bir sonuç varsa.

Benim asıl sorunum, sonunda kendi başına bir istisna atarsa ​​ne olacağı? Döndürülen bir değişkeniniz var ama aynı zamanda başa çıkmanız gereken bir istisna var ... Bu yüzden başkalarının bir try bloğundan dönme hakkında ne düşündüğünü bilmek isterim?


13
Bu tarzın bir yararı x, trybloğun dışında ilan etmek zorunda olmamanızdır . Beyanını kullanıma yakın tutabilirsiniz.
David R Tribble

Yanıtlar:


169

Hayır, kötü bir uygulama değil. returnMantıklı olduğu yere koymak , okunabilirliği ve sürdürülebilirliği artırır ve kodunuzun anlaşılmasını kolaylaştırır. finallyBir returnifade ile karşılaşılırsa bloğun çalıştırılacağına dikkat etmemelisiniz .


19

Nihayet ne olursa olsun idam edilecek, bu yüzden önemli değil.


9
Hayır, aslında, bu sadece fişten çıkarmak değil, StackOverflowException, ThreadAbortException ve OutOfMemoryException gibi eşzamansız istisnalar olarak adlandırılan ve son bloğun çalıştırılmamasına neden olabilecek bazı istisnalar vardır. Bu senaryoların üstesinden gelmek için kısıtlı yürütme bölgeleri hakkında bilgi edinin.
Mehrdad Afshari


14

Şahsen, bu tür bir kodlamadan kaçınırım çünkü son ifadelerden önce dönüş ifadeleri görmek istemiyorum.

Zihnim basit ve işleri oldukça doğrusal olarak işliyor. Bu nedenle, kuru çalıştırma kodunu gözden geçirdiğimde, return ifadesine ulaşabildiğimde, her şeyin takip edileceğini düşünme eğiliminde olacağım, bu durumda bu açıkça oldukça yanlıştır (bu, return ifadesini etkileyeceğinden değil ama yan etkiler neler olabilir).

Böylece, dönüş ifadesinin her zaman final ifadelerinden sonra görünmesi için kodu düzenlerdim.


9

Bu sorunuzu cevaplayabilir

Bir denemede gerçekten ne olur {return x; } sonunda {x = null; } Beyan?

Bu soruyu okuduktan sonra, bir istisna oluşturabileceğini düşünüyorsanız, nihayet ifadesinde başka bir try catch yapısına sahip olabilirsiniz. Derleyici değeri ne zaman döndüreceğini bulacaktır.

Bununla birlikte, kodunuzu yine de yeniden yapılandırmanız daha iyi olabilir, böylece daha sonra sizi veya bundan haberi olmayan başka birini karıştırmasın.


hmmm çok ilginç. Yani bu güvenli olduğu anlamına geliyor, ancak bu kaçınılması gerektiği anlamına mı geliyor?
lomaxx

3
Kişisel olarak, kodunuzun okunabilirliğini biraz zorlaştırdığını düşünüyorum ve bu tek başına, kodu yapılandırmanın başka bir yolunu bulmam için yeterli olacaktır. Ama gerçekten sadece kişisel bir tercih.
Spencer Ruport

3
Kişisel tercihinize katılıyorum :)
lomaxx

Geri dönüşün olduğu yerde iyi olduğunu düşünüyorum. Yöntem, bir istisna atılmadığı sürece değeri döndürür; Nihayet temizleme kodunda istisnanın ortaya çıkıp çıkmaması önemli değildir.
Lawrence Dol

Java'da nihayet geri dönme kısıtlamasının mevcut olmadığını unutmayın (ancak kısıtlamanın iyi bir sınır olduğunu düşünüyorum - tebrikler C #).
Lawrence Dol

5

İşlevsel olarak hiçbir fark yoktur.

Ancak bunu yapmamak için bir neden var. Birkaç çıkış noktası olan daha uzun yöntemleri okumak ve analiz etmek genellikle daha zordur. Ancak bu itirazın, catch ve nihayet bloklardan çok return ifadeleriyle ilgisi vardır.


Ayrıca zor bir yüksek cyclomatic karmaşıklığını okumayı yapar daha yuvalama ile bitebileceğini gibi bu sorun olur
matt_lethargic

3

Örneğinizde her iki şekilde de eşdeğerdir, derleyici aynı kodu oluştursa bile şaşırmam. Nihayet bloğunda bir istisna olursa, return ifadesini bloğa veya dışına koysanız da aynı sorunları yaşarsınız.

Asıl soru, biçimsel olarak hangisinin en iyisi olduğudur. Yöntemlerimi tek bir return ifadesi olacak şekilde yazmayı seviyorum, bu şekilde yöntemden çıkan akışı görmek daha kolay oluyor, bunun sonucu olarak da return ifadesini en sona koymaktan hoşlanıyorum, bu yüzden olduğunu görmek kolay yöntemin sonu ve geri döndüğü şey bu.

Bence son ifade olarak çok düzgün bir şekilde yerleştirilmiş dönüş ifadesi ile, diğerlerinin gelip birden çok iade ifadesini yöntemin diğer bölümlerine serpiştirme olasılığı daha düşü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.