Câu trả lời:
Có một cái nhìn vào System.Diagnostics
không gian tên. Có rất nhiều goodies trong đó!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Điều này thực sự tốt để có một cú chọc vào để tìm hiểu những gì đang diễn ra dưới mui xe.
Tôi khuyên bạn nên xem xét các giải pháp đăng nhập (chẳng hạn như NLog, log4net hoặc các mẫu và thực hành Thư viện doanh nghiệp của Microsoft) có thể đạt được mục đích của bạn và sau đó là một số. Nguoi ban doi may man!
Một cách khác System.Diagnostics.StackTrace
là sử dụng System.En Môi.StackTrace để trả về một chuỗi đại diện của stacktrace.
Một tùy chọn hữu ích khác là sử dụng các biến$CALLER
và $CALLSTACK
gỡ lỗi trong Visual Studio vì điều này có thể được kích hoạt trong thời gian chạy mà không cần xây dựng lại ứng dụng.
Environment.StackTrace
chỉ là một ví dụ mới StackTrace
.
System.Environment.StackTrace
có thể là một cách thuận tiện hơn để truy cập thông tin đó.
System.Diagnostics.StackTrace
- xem msdn.microsoft.com/en-us/l
Environment.StackTrace
luôn luôn bắt đầu với at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Đó không phải là một phần của dấu vết ngăn xếp hiện tại như tại thời điểm mà ai đó đang tìm kiếm nó.
Có hai cách để làm điều này. Các System.Diagnostics.StackTrace()
sẽ cung cấp cho bạn một stack trace cho thread hiện hành. Nếu bạn có một tham chiếu đến một Thread
thể hiện, bạn có thể lấy dấu vết ngăn xếp cho điều đó thông qua phiên bản quá tải của StackTrace()
.
Bạn cũng có thể muốn kiểm tra câu hỏi Stack Overflow Làm thế nào để có được stacktrace của luồng không hiện tại? .
Bạn cũng có thể làm điều này trong trình gỡ lỗi Visual Studio mà không cần sửa đổi mã.
Tất nhiên, điều này không hữu ích nếu bạn đang chạy mã trên một máy khác, nhưng nó khá tiện dụng để có thể tự động nhổ dấu vết ngăn xếp mà không ảnh hưởng đến mã phát hành hoặc thậm chí không cần phải khởi động lại chương trình.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
Đầu ra sẽ tương tự như:
tại YourNamespace.Program.executeMethod (Thông báo chuỗi)
tại YourNamespace.Program.Main (String [] args)
Thay thế Console.WriteLine
bằng Log
phương pháp của bạn . Trên thực tế, không cần cho .ToString()
trường hợp Console.WriteLine vì nó chấp nhận
object
. Nhưng bạn có thể cần điều đó cho phương thức Log (chuỗi thông điệp) của bạn.
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
Dường như làm việc cho tôi
StackTrace
là con chó chậm - vì vậy hãy sử dụng nó một cách tiết kiệm.