Các ngoại lệ không chứa các chi tiết hữu ích vì khái niệm ngoại lệ chưa đủ chín muồi trong kỷ luật công nghệ phần mềm, vì vậy nhiều lập trình viên không hiểu chúng đầy đủ và do đó họ không đối xử đúng với chúng.
Có, IndexOutOfRangeException
nên chứa chỉ mục chính xác nằm ngoài phạm vi, cũng như phạm vi hợp lệ tại thời điểm nó bị ném và nó được coi là thay mặt cho những người tạo ra thời gian chạy .NET mà nó không có. Có, table or view not found
ngoại lệ của Oracle phải chứa tên của bảng hoặc dạng xem không được tìm thấy, và một lần nữa, thực tế là nó không được coi thường thay cho bất kỳ ai chịu trách nhiệm cho việc này.
Đối với một phần lớn, sự nhầm lẫn bắt nguồn từ ý tưởng ban đầu sai lầm rằng các ngoại lệ nên chứa các thông điệp có thể đọc được của con người, từ đó bắt nguồn từ sự thiếu hiểu biết về các ngoại lệ là gì, vì vậy đó là một vòng luẩn quẩn.
Vì mọi người nghĩ rằng ngoại lệ nên chứa thông điệp có thể đọc được của con người, họ tin rằng bất kỳ thông tin nào được mang theo ngoại lệ cũng nên được định dạng thành tin nhắn có thể đọc được của con người, và sau đó họ cảm thấy buồn chán khi viết tất cả tin nhắn có thể đọc được của con người- xây dựng mã, hoặc họ sợ rằng làm như vậy có thể tiết lộ một lượng thông tin không đáng có cho bất cứ con mắt tò mò nào có thể nhìn thấy tin nhắn. (Các vấn đề bảo mật được đề cập bởi các câu trả lời khác.)
Nhưng sự thật của vấn đề là họ không nên lo lắng về điều đó bởi vì ngoại lệ không nên chứa thông điệp có thể đọc được. Trường hợp ngoại lệ là những điều mà chỉ lập trình viên nên nhìn thấy và / hoặc giải quyết. Nếu có nhu cầu trình bày thông tin thất bại cho người dùng, điều đó phải được thực hiện ở mức rất cao, một cách tinh vi và trong ngôn ngữ của người dùng, mà theo thống kê, không chắc là tiếng Anh.
Vì vậy, đối với chúng tôi, các lập trình viên, "thông điệp" của ngoại lệ là tên lớp của ngoại lệ và bất kỳ thông tin nào khác phù hợp với ngoại lệ nên được sao chép vào các biến thành viên (cuối cùng / chỉ đọc) của đối tượng ngoại lệ. Tốt hơn là, mỗi một chút có thể tưởng tượng được của nó. Bằng cách này, không có thông điệp nào cần (hoặc nên) được tạo ra, và do đó không có con mắt tò mò nào có thể nhìn thấy nó.
Để giải quyết mối quan tâm được thể hiện bởi Thomas Owens trong một bình luận dưới đây:
Vâng, tất nhiên, ở một mức độ nào đó, bạn sẽ tạo một thông điệp tường trình liên quan đến ngoại lệ. Nhưng bạn đã thấy vấn đề với những gì bạn đang nói: một mặt, một thông báo nhật ký ngoại lệ không có dấu vết ngăn xếp là vô ích, nhưng mặt khác, bạn không muốn cho phép người dùng nhìn thấy toàn bộ dấu vết ngăn xếp ngoại lệ. Một lần nữa, vấn đề của chúng tôi ở đây là quan điểm của chúng tôi bị sai lệch bởi các tập quán truyền thống. Theo truyền thống, các tệp nhật ký thường ở dạng văn bản đơn giản, có thể vẫn ổn trong khi kỷ luật của chúng ta còn ở giai đoạn sơ khai, nhưng có lẽ không còn nữa: nếu có vấn đề bảo mật, thì tệp nhật ký phải là nhị phân và / hoặc được mã hóa.
Cho dù là văn bản nhị phân hay văn bản thuần túy, tệp nhật ký nên được coi là một luồng mà ứng dụng tuần tự hóa thông tin gỡ lỗi. Một luồng như vậy sẽ chỉ dành cho mắt lập trình viên và nhiệm vụ tạo thông tin gỡ lỗi cho một ngoại lệ sẽ đơn giản như việc tuần tự hóa ngoại lệ vào luồng nhật ký gỡ lỗi. Bằng cách này, bằng cách nhìn vào nhật ký, bạn có thể thấy tên lớp ngoại lệ, (như tôi đã nêu, là dành cho tất cả các mục đích thực tế "thông điệp",) từng biến thành viên ngoại lệ mô tả mọi thứ phù hợp- và thực tế để bao gồm trong một bản ghi và toàn bộ dấu vết ngăn xếp. Lưu ý cách định dạng của một thông báo ngoại lệ có thể đọc được của con người bị thiếu một cách rõ rệt từ quy trình này.
PS
Một vài suy nghĩ của tôi về chủ đề này có thể được tìm thấy trong câu trả lời này: Làm thế nào để viết một thông điệp ngoại lệ tốt
PPS
Có vẻ như nhiều người đã bị đánh dấu bởi đề xuất của tôi về các tệp nhật ký nhị phân, vì vậy tôi đã sửa đổi câu trả lời một lần nữa để làm rõ hơn rằng những gì tôi đề nghị ở đây không phải là tệp nhật ký nên là nhị phân, mà đó là tệp nhật ký có thể là nhị phân, nếu cần.