Jika melempar System.Exception
dianggap sangat buruk, mengapa tidak Exception
dilakukan abstract
sejak awal?
Dengan begitu, tidak mungkin menelepon:
throw new Exception("Error occurred.");
Ini akan menegakkan menggunakan pengecualian turunan untuk memberikan rincian lebih lanjut tentang kesalahan yang terjadi.
Misalnya, ketika saya ingin memberikan hierarki pengecualian kustom untuk perpustakaan, saya biasanya mendeklarasikan kelas dasar abstrak untuk pengecualian saya:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
Dan kemudian beberapa pengecualian yang diturunkan dengan tujuan yang lebih spesifik:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Kemudian ketika memanggil metode pustaka apa pun, seseorang dapat meminta blok coba / tangkap generik ini untuk secara langsung menangkap kesalahan yang datang dari pustaka:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Apakah ini praktik yang baik?
Apakah lebih baik jika Exception
dibuat abstrak?
EDIT: Maksud saya di sini adalah bahwa bahkan jika kelas pengecualian ditandai abstract
, Anda masih bisa menangkapnya di blok tangkap semua. Menjadikannya abstrak hanyalah cara untuk melarang pemrogram untuk melemparkan pengecualian "super-lebar". Biasanya, ketika Anda secara sukarela melempar pengecualian, Anda harus tahu apa itu dan mengapa itu terjadi. Dengan demikian menegakkan untuk melemparkan jenis pengecualian yang lebih spesifik.
sumber
Jawaban:
Saya tidak tahu alasan sebenarnya mengapa hal itu dilakukan dengan cara ini, dan pada tingkat tertentu saya setuju bahwa mencegah pengecualian yang sangat luas untuk dilempar akan menjadi hal yang baik.
TETAPI ... ketika mengkodekan aplikasi demo kecil atau pembuktian konsep, saya tidak ingin mulai mendesain 10 sub-kelas pengecualian yang berbeda, atau menghabiskan waktu untuk memutuskan mana yang merupakan kelas pengecualian "terbaik" untuk situasi tersebut. Saya lebih suka melempar
Exception
dan memberikan string yang menjelaskan detailnya. Ketika itu adalah kode yang dibuang, saya tidak peduli tentang hal-hal ini dan jika saya dipaksa untuk peduli dengan hal-hal seperti itu, saya akan membuatGenericException
kelas sendiri dan membuangnya di mana - mana, atau pindah ke alat / bahasa yang berbeda. Untuk beberapa proyek, saya setuju bahwa membuat subkelas Pengecualian yang relevan adalah penting, tetapi tidak semua proyek mengharuskannya.sumber
Kemungkinan A: Secara logis benar.
Anda benar bahwa Microsoft, dan banyak lainnya tidak menyarankan untuk melemparkan
new Exception()
langsung karena sejumlah alasan.Karena itu, kita dapat mempertimbangkan cita-cita akademis bahwa tujuan
Exception
hierarki kelas adalah untuk menentukan efek penyempitan sehingga hanya pengecualian paling spesifik yang dapat ditangkap. (YaituArgumentNullException
lebih sempit dariArgumentException
).Kelas Exception tidak terkecuali (pun tidak dimaksudkan). Ini dimaksudkan sebagai pengecualian seluas mungkin, "pengecualian super" yang hampir tidak dapat ditangkap karena cakupannya sangat luas. 'Pengecualian' bukan
abstract
berarti Pengecualian tidak bisa eksis sebagai entitas sendiri. Ini dapat (meskipun diakui belum ada kasus yang baik didefinisikan - lihat Kemungkinan B), dan karena itu harus dapat dibangun secara publik.Kata kunci 'abstrak' (dalam arti akademis murni) hanya berlaku ketika kelas dasar tidak masuk akal sendiri - yaitu
FourLeggedAnimal
.Semua ini dalam pikiran, tidak akan ada alasan teknis untuk membuat kelas
abstract
, selain menjadi sumber kejengkelan bagi pengembang .Kemungkinan B: Desain Terkunci / Mereka tidak tahu
Jika MS membuat kelas ini abstrak, mereka mungkin dalam masalah jika mereka berubah pikiran, karena kelas ini sangat penting untuk dasar-dasar bahasa. Mereka sudah melakukan kesalahan dengan
ApplicationException
, jadi dapat diperkirakan bahwa mereka mengantisipasi perubahan dalam rekomendasi juga. (lihat http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx )Mungkin ada alasan lain (saya pikir mungkin ini ada hubungannya dengan Reflection, atau beberapa alasan teknis lainnya), jadi saya membuat posting ini sebagai CW.
sumber
abstract
kata kunci mengenai dinding ini. Tidak yakin dengan cara apa pun untuk mengatasinya selain menunjukkanabstract
kata kunci dengan backticks.