Đây là nguồn thực tế cho .NET của System.Exception.ToString
:Tại sao System.Exception.ToString không gọi hàm ToString ảo cho các ngoại lệ bên trong?
public override string ToString()
{
return this.ToString(true, true);
}
private string ToString(bool needFileLineInfo, bool needMessage)
{
string str1 = needMessage ? this.Message : (string) null;
string str2 = str1 == null || str1.Length <= 0 ? this.GetClassName() : this.GetClassName() + ": " + str1;
if (this._innerException != null)
str2 = str2 + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
str2 = str2 + Environment.NewLine + stackTrace;
return str2;
}
Ngoài những xấu xa tuyệt đối, người ta có thể nhận thấy rằng cho tất cả các trường hợp ngoại lệ bên trong tư nhân, ToString phi ảo sẽ được gọi. Nói cách khác, nếu bạn quá tải ToString
trong trường hợp ngoại lệ , nó sẽ không được gọi nếu ngoại lệ của bạn xảy ra được lồng nhau. Ồ, chờ đã, hóa ra các ngoại lệ tích hợp có cùng vấn đề, ví dụ: System.IO.FileNotFoundException
in ra đường dẫn của tập tin - nó không phải là một phần của tin nhắn:
public override string ToString()
{
string str = this.GetType().FullName + ": " + this.Message;
if (this._fileName != null && this._fileName.Length != 0)
str = str + Environment.NewLine + Environment.GetResourceString("IO.FileName_Name", new object[1]
{
(object) this._fileName
});
...
}
Nhưng nếu bạn quấn một thể hiện ... thông tin này sẽ bị mất, trừ khi bạn đi qua cây ngoại lệ bản thân và phát hiện trường hợp ngoại lệ hãy gọi hoặc tự gọi số ToString
và thực hiện một số phân tích cú pháp.
Đó là một sự bất tiện khó chịu, làm cho các hộp thoại ghi nhật ký/ghi lỗi hoặc mất thông tin hoặc bị lỗi. Điều thú vị là Mono gets it right.
Có bất kỳ sự khôn ngoan ẩn nào trong phiên bản .NET không?
EDIT: đây không phải là câu hỏi dựa trên ý kiến. Trong khi tôi thấy sự lựa chọn thiết kế này gây phiền nhiễu, tôi muốn biết những lợi ích của phương pháp này. Biết chúng có thể có lợi khi desiging giải pháp mới.
Tôi nhận được quan điểm của bạn, nhưng lưu ý rằng việc trình bày ngăn xếp ngoại lệ và/hoặc ngăn xếp cuộc gọi cho người dùng có thể là một lỗi bảo mật. Chưa kể rằng 'ToString' mặc định cũng in thuộc tính' Message', có thể chứa dữ liệu nhạy cảm. Vì vậy, nếu đây là một quyết định thiết kế của Microsoft, nó đã trở thành một trung gian không phục vụ an ninh, cũng không phải là thông tin; cho các chương trình "bán lẻ", bạn không nên hiển thị kết quả của 'ToString' ở tất cả, cho công nghệ trong nhà bạn cần thêm thông tin (nó là ra khỏi đó!). – gwiazdorrr