EDIT: C # 6.0 itibariyle, istisna filtreleri artık gitmek için mükemmel bir yol olduğunu söyleyen diğerleri ile aynı fikirde:catch (Exception ex) when (ex is ... || ex is ... )
Dışında hala bir-uzun satır düzeni nefret ediyorum ve şahsen aşağıdaki gibi kodu koymak istiyorum. Bence bu estetik kadar işlevsel, çünkü kavrayışı geliştirdiğine inanıyorum. Bazıları buna katılmayabilir:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ORİJİNAL:
Burada partiye biraz geç kaldığımı biliyorum, ama kutsal duman ...
Doğrudan kovalamacaya geçmek için, bu tür daha önceki bir cevabı çoğaltır, ancak gerçekten birkaç istisna türü için ortak bir eylem gerçekleştirmek ve her şeyi tek bir yöntem kapsamında düzgün ve düzenli tutmak istiyorsanız, neden sadece bir lambda kullanmıyorsunuz? / closure / satır içi işlevi aşağıdaki gibi bir şey yapmak için? Demek istediğim, bu kapıyı her yerde kullanabileceğiniz ayrı bir yöntem haline getirmek istediğinizi fark edeceksiniz. Ancak, kodun geri kalanını yapısal olarak değiştirmeden bunu yapmak çok kolay olacaktır. Sağ?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
Merak edemiyorum ama merak ediyorum ( uyarı: biraz ironi / alaycı önde) neden dünyadaki temelde aşağıdakileri değiştirmek için tüm bu çabaya gidiyor:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... bir sonraki kod kokusunun çılgınca bir çeşitlemesiyle, örneğin, sadece birkaç tuşa basıyormuş gibi davranmak için.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Çünkü kesinlikle otomatik olarak daha okunaklı değil.
Kabul edersek, /* write to a log, whatever... */ return;
ilk örnekten üç özdeş örneği bıraktım .
Ama bu bir bakıma. Hepiniz işlevleri / yöntemleri duydunuz, değil mi? Ciddi anlamda. Ortak bir ErrorHandler
işlev yazın ve her catch bloğundan çağırın.
Bana sorarsanız, ikinci örnek ( if
ve is
anahtar sözcükleriyle birlikte) hem projenizin bakım aşamasında hem daha az okunabilir, hem de eşzamanlı olarak daha fazla hataya açıktır.
Programlamaya nispeten yeni olabilecek herkes için bakım aşaması, projenizin genel ömrünün% 98,7'sini veya daha fazlasını içerecektir ve bakımı yapan zayıf schmuck neredeyse sizden başka biri olacaktır. Ve zamanlarının% 50'sini isminizi lanetleyerek işte geçirecekleri çok iyi bir şans var.
Ve tabii FxCop sana ve zorunda kabukları da kesin olarak çalışan program ile yapmak zip gelmiştir Kodunuza bir öznitelik eklemek ve vakaların 99.9% olarak tamamen olduğuna bir sorunu görmezden FxCop anlatmak için sadece orada işaretlemede doğru. Ve üzgünüm, yanılmış olabilirim, ancak bu "yoksay" özelliği aslında uygulamanızda derlenmiş değil mi?
if
Testin tamamını tek bir satıra yerleştirmek daha okunabilir hale getirir mi? Ben öyle düşünmüyorum. Demek istediğim, uzunca bir zaman önce bir satırda daha fazla kod koymanın "daha hızlı çalışmasını" sağlayacağını savunan başka bir programcı vardı. Ama elbette o sert çılgınca deli olmuştu. Ona (düz bir yüzle - zorlayıcıydı), yorumlayıcının veya derleyicinin bu uzun çizgiyi satır başına ayrı bir talimat başına ayrı ayrı nasıl ayıracağını açıklamaya çalışarak - esas olarak ilerlemişse sonuçla aynıdır ve sadece derleyiciyi zekice çalıştırmaya çalışmak yerine kodu okunabilir hale getirdi - onun üzerinde hiçbir etkisi olmadı. Ama konuţuyorum.
Bundan bir veya iki ay sonra üç istisna türü daha eklediğinizde ne kadar az okunabilir? (Cevap: çok daha az okunabilir hale gelir).
Asıl önemli noktalardan biri, aslında, her gün baktığımız metinsel kaynak kodunu biçimlendirme noktasının çoğunun, kod çalıştığında gerçekte olanları diğer insanlara gerçekten, gerçekten açık hale getirmektir. Çünkü derleyici kaynak kodunu tamamen farklı bir şeye dönüştürüyor ve kod biçimlendirme stilinizi daha az önemsemiyordu. Yani hepsi bir arada tamamen berbat.
Sadece söylüyorum...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}