Với SDK công khai của chúng tôi, chúng tôi có xu hướng muốn đưa ra những thông điệp rất thông tin về lý do tại sao một ngoại lệ xảy ra. Ví dụ:
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);
}
Tuy nhiên, điều này có xu hướng làm lộn xộn dòng mã, vì nó có xu hướng tập trung nhiều vào các thông báo lỗi hơn là những gì mã đang làm.
Một đồng nghiệp bắt đầu tái cấu trúc một số ngoại lệ ném vào một cái gì đó như thế này:
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);
}
Điều này làm cho logic mã dễ hiểu hơn, nhưng thêm rất nhiều phương thức bổ sung để xử lý lỗi.
Các cách khác để tránh vấn đề "logic lộn xộn thông điệp dài" là gì? Tôi chủ yếu hỏi về C # /. NET thành ngữ, nhưng cách các ngôn ngữ khác quản lý nó cũng hữu ích.
[Biên tập]
Sẽ rất tốt nếu có những ưu và nhược điểm của từng phương pháp.
Exception.Data
tính, bắt ngoại lệ "kén chọn", bắt mã cuộc gọi và thêm bối cảnh của chính nó, cùng với ngăn xếp cuộc gọi bị bắt, tất cả thông tin đóng góp sẽ cho phép các tin nhắn dài dòng hơn. Cuối cùng có System.Reflection.MethodBase
vẻ hứa hẹn cung cấp chi tiết để chuyển sang phương pháp "xây dựng ngoại lệ" của bạn.
Exception.Data
. Sự nhấn mạnh nên được chụp từ xa. Tái cấu trúc ở đây là tốt, nhưng nó bỏ lỡ vấn đề.