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 catchklausa . Melempar a BadControlFlowThatShouldBeRewrittenExceptionmungkin 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
nullsebaliknya.
Sepertinya metode di mana kode ini ditulis, hanya melakukan terlalu banyak hal. GetDataFromServermengembalikan booltampilan 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 ProcessDatadan melihat bahwa iterasi result, dan kembali nulljika 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 GetDataFromServermeledak dengan pengecualian yang tidak Anda harapkan, Anda menelannya, mendorongnya di bawah karpet dan mengembalikan nullnilai. Saya akan merekomendasikan menangkap pengecualian khusus dalam kasus ini, dan mencatat semuanya; debugging akan jauh lebih mudah seperti itu.
Dengan catchklausa 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 ejika ada masalah.
TL; DR : Tidak, melempar dan menangkap pengecualian untuk kontrol aliran bukanlah ide yang baik.