Hit kinerja paling mungkin diabaikan, seperti dijelaskan dalam jawaban ini .
Jadi mari kita pergi dengan gagasan bahwa kinerja bukan masalah. Anda melempar System.Exception
, hanya untuk memindahkan eksekusi ke catch
klausa . Melempar a BadControlFlowThatShouldBeRewrittenException
mungkin akan berlebihan.
Mari kita hancurkan ini. Kita punya:
- Metode
GetDataFromServer
(nama metode harus PascalCase dalam C #), yang mungkin dapat melempar pengecualian, atau mengembalikan a bool
.
- Jika hasilnya
true
, jalankan ProcessData
.
- Kembali
null
sebaliknya.
Sepertinya metode di mana kode ini ditulis, hanya melakukan terlalu banyak hal. GetDataFromServer
mengembalikan bool
tampilan seperti cacat desain, saya akan mengharapkan metode untuk mengembalikan data yang didapatnya dari server , beberapa IEnumerable<SomeType>
yang akan berisi 0 atau lebih item - yaitu jalur bahagia mengembalikan n item di mana n> 0 , tidak begitu bahagia path mengembalikan 0 item, dan path yang tidak bahagia meledak dengan pengecualian yang tidak tertangani, apa pun itu.
Itu mengubah seperti apa metodenya, cukup banyak - sekali lagi sulit untuk mengatakan apakah ini masuk akal, karena posting asli hanya memiliki satu titik keluar (dan dengan demikian tidak dapat dikompilasi, karena tidak semua jalur kode mengembalikan nilai ), jadi ini hanya tebakan liar:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Di sini Anda akan melihat ProcessData
dan melihat bahwa iterasi result
, dan kembali null
jika tidak ada item di IEnumerable
.
Sekarang mengapa metodenya kembali null
? Server sedang down? Apakah ada bug dalam kueri? String koneksi menggunakan kredensial yang salah? Setiap kali GetDataFromServer
meledak dengan pengecualian yang tidak Anda harapkan, Anda menelannya, mendorongnya di bawah karpet dan mengembalikan null
nilai. Saya akan merekomendasikan menangkap pengecualian khusus dalam kasus ini, dan mencatat semuanya; debugging akan jauh lebih mudah seperti itu.
Dengan catch
klausa umum yang tidak menangkap pengecualian, akan sangat sulit untuk mendiagnosis apa pun. Saya akan melakukan ini secara minimal:
catch(Exception e)
{
return null;
}
Sekarang Anda setidaknya bisa istirahat dan memeriksa e
jika ada masalah.
TL; DR : Tidak, melempar dan menangkap pengecualian untuk kontrol aliran bukanlah ide yang baik.