Dengan SDK publik kami, kami cenderung ingin memberikan pesan yang sangat informatif tentang mengapa pengecualian terjadi. Sebagai contoh:
if (interfaceInstance == null)
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
throw new InvalidOperationException(errMsg);
}
Namun, ini cenderung mengacaukan aliran kode, karena cenderung lebih fokus pada pesan kesalahan daripada apa yang dilakukan kode.
Seorang kolega mulai refactoring beberapa pengecualian untuk sesuatu seperti ini:
if (interfaceInstance == null)
throw EmptyConstructor();
...
private Exception EmptyConstructor()
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
return new InvalidOperationException(errMsg);
}
Yang membuat logika kode lebih mudah dipahami, tetapi menambahkan banyak metode tambahan untuk melakukan penanganan kesalahan.
Apa cara lain untuk menghindari masalah "logika kekacauan lama-pesan-pengecualian"? Saya terutama bertanya tentang idiom C # /. NET, tetapi bagaimana bahasa lain mengaturnya juga membantu.
[Sunting]
Akan menyenangkan untuk memiliki pro dan kontra dari setiap pendekatan juga.
Exception.Data
properti, "pilih-pilih" menangkap menangkap, memanggil kode menangkap & menambahkan konteksnya sendiri, bersama dengan tumpukan panggilan yang ditangkap semua berkontribusi informasi yang harus memungkinkan pesan jauh lebih sedikit. Akhirnya System.Reflection.MethodBase
terlihat menjanjikan untuk memberikan rincian untuk diteruskan ke metode "pengecualian konstruksi" Anda.
Exception.Data
. Penekanannya harus menangkap telemetri. Refactoring di sini baik-baik saja, tetapi merindukan masalahnya.