2009-04-01 29 views
32

Vì mục đích chẩn đoán, đôi khi tôi cần lưu trữ ngăn xếp cuộc gọi dẫn đến chuyển đổi trạng thái đã cho (chẳng hạn như cấp khóa, cam kết giao dịch, v.v.) sau đó tôi có thể tìm ra ai ban đầu đã kích hoạt quá trình chuyển đổi trạng thái.Xác định ngăn xếp cuộc gọi hiện tại (Đối với mục đích chẩn đoán)

Hiện nay, cách duy nhất tôi biết để lấy các cuộc gọi stack trông giống như đoạn mã sau đây, mà tôi xem xét khủng khiếp xấu xí:

StackTraceElement[] cause; 
try { 
    throw new Exception(); 
} catch (Exception e) { 
    cause = e.getStackTrace(); 
} 

Có ai đó biết một cách tốt hơn để thực hiện điều này?

Trả lời

67

Tôi nghĩ rằng bạn có thể nhận được điều tương tự với:

StackTraceElement[] cause = Thread.currentThread().getStackTrace(); 
9

Vâng, bạn có thể cải thiện nó một chút bằng cách không thực sự ném ngoại lệ.

Exception ex = new Exception(); 
ex.fillInStackTrace(); 
StackTraceElement[] cause = ex.getStackTrace(); 

Thực ra, tôi vừa kiểm tra: người xây dựng gọi fillInStackTrace() rồi. Vì vậy, bạn có thể đơn giản hóa nó để:

StackTraceElement[] cause = new Exception().getStackTrace(); 

Đây thực sự là những gì Thread.getStackTrace() không nếu nó được gọi là trên thread hiện hành, vì vậy bạn có thể thích sử dụng nó để thay thế.

+0

Không cần cho 'fillInStackTrace' (mặc dù nó rất dễ dàng để đọc tài liệu API của nó về phía sau). –

2

Nếu bạn muốn nó như là một String và sử dụng Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable()) 
Các vấn đề liên quan