2013-01-19 23 views
33

Tôi có đoạn mã sau:Làm cách nào để thêm thông báo vào ngoại lệ mà không làm mất bất kỳ thông tin nào trong C#?

catch(Exception ex) 
{ 
    throw new FatalException("An error occurred while trying to load the XSLT file.", ex); 
} 

này không may chỉ nuốt ngoại lệ. Tôi có thể sửa lỗi này bằng cách thực hiện như sau:

catch(Exception ex) 
{ 
    throw; 
} 

Nhưng tôi vẫn muốn bao gồm thông báo tùy chỉnh để được trợ giúp ghi nhật ký sự kiện.

Làm cách nào để thêm thông báo này vào ngoại lệ mà không làm mất bất kỳ thông tin nào? (dấu vết ngăn xếp/biểu tượng gỡ lỗi, v.v.)

+0

Thêm ngoại lệ ban đầu dưới dạng 'Ngoại lệ' trên' FatalException'? –

+0

Đó là vào cuối của 'ném mới FatalException (" tin nhắn ", cũ)'. – krillgar

+0

Tại sao bạn muốn làm những gì hiển thị của bạn? Chỉ bắt ngoại lệ bạn có thể làm điều gì đó với. Nếu không, hãy để chúng bong bóng lên. – Mark

Trả lời

13

Ngoại lệ ban đầu đó vẫn còn ở đó.

Khi bạn thực hiện đăng nhập ngoại lệ, ngoại lệ bạn nhận được sẽ là FatalException mà bạn đã thực hiện với thư của mình. Ngoại lệ ban đầu là trong ex.InnerException. Bạn có thể tiếp tục chu kỳ thông qua InnerException cho đến khi nó rỗng để nhận tất cả thông tin Stack Trace, v.v.

0

Tóm lại, đừng.

Tôi chắc chắn bạn có thể tìm thấy một số cách để giải quyết vấn đề này với một số phản ánh, nhưng tôi sẽ mạnh mẽ cảnh báo bạn chống lại điều này. Nó đi ngược lại thiết kế ban đầu của các ngoại lệ trong .NET. Các ngoại lệ không chỉ ở đó để giúp ghi nhật ký, chúng còn cung cấp thông tin về nguyên nhân ban đầu của một lỗi ứng dụng.

Sử dụng tùy chọn đầu tiên thường được ưu tiên vì nó duy trì theo dõi ngăn xếp của ngoại lệ ban đầu nhưng cho phép bạn cung cấp thông tin bổ sung bằng cách gói nó trong một ngoại lệ riêng biệt. Trong mã của riêng tôi, bất cứ khi nào tôi đăng nhập ngoại lệ, hàm ghi nhật ký của tôi sẽ recurse thông qua thuộc tính InnerException để tìm mọi bit thông tin hữu ích có thể có về lỗi.

+0

"Ghi nhật ký" có thể không phải là thuật ngữ tốt nhất để sử dụng cho việc này. Nếu bạn đang làm điều gì đó từ xa, bạn chỉ có thể gửi email cho các loại ngoại lệ cụ thể khi bạn không có quyền truy cập vào bất kỳ đăng nhập nào. – krillgar

46

Nếu bạn chỉ cần thêm thông tin vào ngoại lệ ban đầu, chẳng hạn như thư có thể đọc được hoặc chi tiết cụ thể hữu ích cho bạn khi theo dõi lỗi, nhưng điều đó sẽ không hữu ích cho người dùng cuối, bạn có thể sử dụng thuộc tính Data của Exception, đây là từ điển cặp khóa/giá trị.

Chúng tôi sử dụng rộng rãi để ghi lại thông tin như báo cáo đang được thực hiện hoặc tệp đang được xử lý để các hoạt động có thể xác định chính xác những gì đang xảy ra tại thời điểm xảy ra lỗi. Người dùng không cần chi tiết này vì họ đang làm việc trực tiếp với nguyên nhân gây ra lỗi.

Bạn cũng có thể sử dụng quyền này để chuyển một tin nhắn văn bản thuần túy có ý nghĩa với người dùng. Vấn đề duy nhất là bạn sẽ phải thực hiện một số công việc bổ sung trong khung đăng nhập của bạn hoặc giao diện người dùng cuối để trích xuất dữ liệu và làm cho nó hữu ích cho người tiêu dùng.

Ví dụ, bạn có thể làm:

catch (Exception ex) 
{ 
    ex.Data.Add("UserMessage", "An error occurred while trying to load the XSLT file."); 
    throw; 
} 

Sau đó, trong client-side code, bạn có thể kiểm tra để xem nếu UserMessage tồn tại và nếu như vậy, hiện tại nó cho người sử dụng thay cho Ngoại lệ:

catch (Exception ex) 
{ 
    if (ex.Data.Contains("UserMessage")) 
    { 
     MessageBox.Show(ex.Data["UserMessage"].ToString()); 
    } 
    else 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 
+2

Thậm chí tốt hơn sẽ là 'ex.Data [" UserMessage "] + =" Đã xảy ra lỗi ... ";' để nếu một số mã cấp thấp hơn đã thêm một tin nhắn, nó sẽ thêm văn bản thừa vào nó thay vì ném một ['ArgumentException'] (http://msdn.microsoft.com/en-us/library/system.collections.idictionary.add (v = vs.110) .aspx # ddueExceptionsToggle) – KyleMit

+0

Tuyệt vời, cảm ơn bạn! Dữ liệu bổ sung này cũng tự động được thêm vào nhật ký dò vết .NET và nếu bạn sử dụng các khóa duy nhất và thông điệp mô tả tất cả các cách cố gắng/bắt chuỗi, sẽ không mất thời gian để tìm nguyên nhân gây ra lỗi. – Joel

+0

Lợi ích của việc này là gì hơn là ném một ngoại lệ mới và chuyển giao bản gốc như một ngoại lệ bên trong theo câu trả lời được chấp nhận? – ajbeaven

Các vấn đề liên quan