EDIT: Saya setuju dengan orang lain yang mengatakan bahwa, pada C # 6.0, filter pengecualian sekarang merupakan cara yang baik untuk digunakan:catch (Exception ex) when (ex is ... || ex is ... )
Kecuali bahwa saya masih agak benci tata letak garis panjang dan secara pribadi akan mengeluarkan kode seperti berikut. Saya pikir ini fungsional seperti estetika, karena saya percaya ini meningkatkan pemahaman. Beberapa mungkin tidak setuju:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ASLI:
Saya tahu saya sedikit terlambat ke pesta di sini, tetapi asap suci ...
Memotong langsung ke pengejaran, jenis ini menduplikasi jawaban sebelumnya, tetapi jika Anda benar-benar ingin melakukan tindakan umum untuk beberapa jenis pengecualian dan menjaga semuanya tetap rapi dan rapi dalam ruang lingkup satu metode, mengapa tidak hanya menggunakan lambda / closure / inline berfungsi untuk melakukan sesuatu seperti berikut ini? Maksud saya, peluangnya cukup bagus sehingga Anda akhirnya menyadari bahwa Anda hanya ingin membuat penutupan itu sebagai metode terpisah yang dapat Anda manfaatkan di semua tempat. Tetapi kemudian akan sangat mudah untuk melakukan itu tanpa benar-benar mengubah sisa kode secara struktural. Baik?
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 ); }
}
Saya tidak bisa menahan diri untuk bertanya-tanya ( peringatan: sedikit ironi / sarkasme di muka) mengapa harus melakukan semua upaya ini pada dasarnya hanya mengganti yang berikut ini:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... dengan beberapa variasi gila dari bau kode selanjutnya, maksud saya contoh, hanya untuk berpura-pura bahwa Anda menyimpan beberapa penekanan tombol.
// 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;
}
Karena itu tentu saja tidak secara otomatis lebih mudah dibaca.
Memang, saya meninggalkan tiga contoh identik dari /* write to a log, whatever... */ return;
contoh pertama.
Tapi itu maksud saya. Kalian pernah mendengar fungsi / metode, kan? Serius. Tulis ErrorHandler
fungsi umum dan, seperti, panggil dari masing-masing blok tangkapan.
Jika Anda bertanya kepada saya, contoh kedua (dengan if
dan is
kata kunci) keduanya kurang terbaca secara signifikan, dan secara bersamaan lebih rentan terhadap kesalahan selama fase pemeliharaan proyek Anda.
Fase pemeliharaan, bagi siapa saja yang mungkin relatif baru dalam pemrograman, akan mencapai 98,7% atau lebih dari keseluruhan masa hidup proyek Anda, dan orang bodoh yang melakukan pemeliharaan hampir pasti akan menjadi orang lain selain Anda. Dan ada kemungkinan yang sangat baik bahwa mereka akan menghabiskan 50% dari waktu mereka untuk pekerjaan mengutuk nama Anda.
Dan tentu saja FxCop menggonggong pada Anda dan Anda juga harus menambahkan atribut ke kode Anda yang memiliki persis zip terkait dengan program yang sedang berjalan, dan hanya ada di sana untuk memberitahu FxCop untuk mengabaikan masalah bahwa dalam 99,9% kasus itu benar-benar benar dalam menandai. Dan, maaf, saya mungkin salah, tetapi bukankah atribut "abaikan" itu benar-benar dikompilasi ke dalam aplikasi Anda?
Apakah menempatkan seluruh if
tes pada satu baris membuatnya lebih mudah dibaca? Saya kira tidak. Maksud saya, saya punya programmer lain yang dengan keras berdebat sekali dulu bahwa menempatkan lebih banyak kode pada satu baris akan membuatnya "berjalan lebih cepat." Tapi tentu saja dia murka. Mencoba menjelaskan kepadanya (dengan wajah lurus - yang menantang) bagaimana penerjemah atau kompiler akan memecah garis panjang itu menjadi pernyataan satu-instruksi-per-garis yang terpisah - pada dasarnya identik dengan hasilnya jika ia terus maju dan hanya membuat kode dapat dibaca alih-alih mencoba mengompilasi kompiler - tidak berpengaruh padanya. Tapi saya ngelantur.
Berapa banyak kurang dibaca tidak mendapatkan ini ketika Anda menambahkan tiga jenis pengecualian lebih, satu atau dua bulan dari sekarang? (Jawaban: itu mendapat banyak kurang dibaca).
Salah satu poin utama, sungguh, adalah bahwa sebagian besar titik memformat kode sumber tekstual yang kita semua lihat setiap hari adalah untuk membuatnya benar-benar jelas bagi manusia lain apa yang sebenarnya terjadi ketika kode dijalankan. Karena kompiler mengubah kode sumber menjadi sesuatu yang sama sekali berbeda dan tidak peduli tentang gaya pemformatan kode Anda. Jadi all-on-one-line benar-benar menyebalkan juga.
Hanya mengatakan ...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}