Tại sao nhiều thông báo ngoại lệ không chứa chi tiết hữu ích?


220

Dường như có một số lượng thỏa thuận nhất định rằng các thông báo ngoại lệ nên chứa các chi tiết hữu ích .

Tại sao nhiều ngoại lệ phổ biến từ các thành phần hệ thống không chứa các chi tiết hữu ích?

Một vài ví dụ:

  • NET Listtruy cập chỉ mục ArgumentOutOfRangeExceptionnào không cho tôi biết giá trị chỉ số mà bị xét xử và không hợp lệ, cũng không cho tôi biết phạm vi cho phép.
  • Về cơ bản, tất cả các thông báo ngoại lệ từ thư viện chuẩn MSVC C ++ hoàn toàn vô dụng (trong cùng một hướng dẫn như trên).
  • Các trường hợp ngoại lệ của Oracle trong .NET, nói với bạn (không hiểu) "Không tìm thấy BẢNG HOẶC XEM", nhưng không tìm thấy cái nào .

Vì vậy, đối với tôi, dường như đối với hầu hết các thông báo ngoại lệ không chứa đủ chi tiết hữu ích. Là kỳ vọng của tôi ngoài dòng? Tôi có đang sử dụng ngoại lệ sai mà tôi thậm chí nhận thấy điều này? Hoặc có lẽ ấn tượng của tôi là sai: đa số trường hợp ngoại lệ làm thực sự cung cấp thông tin chi tiết hữu ích?


59
Cần lưu ý rằng từ phía các chuyên gia bảo mật, "thông báo lỗi không được chứa thông tin chi tiết về nội bộ của hệ thống" là một quy tắc chung.
Telastyn

118
@Telastyn: Chỉ khi hệ thống của bạn mở cho những kẻ tấn công. Ví dụ: nếu bạn đang chạy một máy chủ Web, bạn muốn cung cấp các thông báo lỗi nhạt nhẽo cho người dùng cuối, nhưng bạn vẫn muốn các thông báo lỗi rất chi tiết để đăng nhập vào cuối của bạn. Và trên phần mềm phía máy khách, nơi người dùng không phải là kẻ tấn công, bạn chắc chắn muốn các thông báo lỗi đó càng chi tiết càng tốt, để khi có sự cố và bạn nhận được báo cáo lỗi, bạn có nhiều thông tin để xử lý càng tốt, bởi vì rất nhiều lần đó là tất cả những gì bạn nhận được.
Mason Wheeler

9
@Snowman: Điều gì không thể truy cập được đối với người dùng nếu đó là phần mềm phía máy khách? Chủ sở hữu của máy sở hữu máy và có thể nhận được bất cứ điều gì.
Mason Wheeler


6
Luôn có một số thông tin bổ sung mà bạn muốn có. Tôi thấy các thông điệp mà bạn đưa ra làm ví dụ là khá tốt. Bạn có thể gỡ lỗi vấn đề với họ. Tốt hơn nhiều so với "lỗi 0x80001234" (ví dụ lấy cảm hứng từ Windows Update).
usr

Câu trả lời:


204

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ó, IndexOutOfRangeExceptionnê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 foundngoạ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.


4
Tôi đã xem qua một số lớp ngoại lệ trong .NET Framework và hóa ra có rất nhiều cơ hội để thêm loại thông tin này theo chương trình. Vì vậy, tôi đoán câu hỏi được giải quyết thành "tại sao họ không." Nhưng +1 cho toàn bộ điều "con người có thể đọc được".
Robert Harvey

7
Tôi không đồng ý rằng các trường hợp ngoại lệ không nên chứa thành phần có thể đọc được. Ở một mức độ nào đó, bạn có thể muốn tạo một thông điệp tường trình liên quan đến ngoại lệ. Tôi cho rằng việc ghi nhật ký theo dõi ngăn xếp vào tệp nhật ký người dùng có thể đọc được sẽ tiết lộ chi tiết triển khai mà bạn không muốn tiết lộ, vì vậy thông điệp có thể đọc được của con người sẽ được ghi lại. Khi được trình bày với tệp nhật ký có lỗi, nhà phát triển nên có điểm bắt đầu để bắt đầu gỡ lỗi và có thể buộc ngoại lệ xảy ra. Thành phần có thể đọc được của con người nên được chi tiết phù hợp mà không cần thực hiện.
Thomas Owens

44
Vì vậy, lập trình viên không phải là con người? Nhìn vào các đồng nghiệp của tôi, điều này xác nhận một số nghi ngờ tôi đã có một thời gian ...
gbjbaanb

51
Một lần nữa, không có gì sai khi cho phép người dùng nhìn thấy toàn bộ dấu vết ngăn xếp , miễn là phần mềm ở phía máy khách. Mọi dự án phần mềm chuyên nghiệp mà tôi từng làm, và hầu hết các dự án nghiệp dư, đều có một hệ thống ghi nhật ký sẽ tạo ra một lỗi đầy đủ khi một ngoại lệ chưa được xử lý được đưa ra, bao gồm cả dấu vết ngăn xếp đầy đủ của tất cả các luồng hiện đang chạy trong quá trình. Và người dùng có thể (thở hổn hển, kinh dị!) Nhìn vào bất cứ lúc nào anh ta muốn, vì điều đó là cần thiết (không đơn giản là hữu ích, nhưng bắt buộc ) để gửi thông báo lỗi cho chúng tôi! Điều gì là sai với điều đó?
Mason Wheeler

13
Tôi cũng không bị thuyết phục đối với các tệp nhật ký chỉ nhị phân . Chủ yếu là vì kinh nghiệm của tôi với systemd. Công cụ đặc biệt của nó để xem các bản ghi này khá khó hiểu và dường như được thiết kế bởi một ủy ban khỉ của Shakespeare. Hãy xem xét rằng, đối với một ứng dụng web, người đầu tiên nhìn thấy ngoại lệ của bạn thường là sysadmin và anh ta sẽ muốn xác định xem đó có phải là thứ anh ta cần sửa hay không (ví dụ như đĩa hết dung lượng) hoặc quay trở lại cho các nhà phát triển.
Michael Hampton

46

Tại sao nhiều ngoại lệ phổ biến từ các thành phần hệ thống không chứa các chi tiết hữu ích?

Theo kinh nghiệm của tôi, có một số lý do mà các ngoại lệ không chứa thông tin hữu ích. Tôi hy vọng rằng những loại lý do này cũng sẽ áp dụng cho các thành phần hệ thống - nhưng tôi không biết chắc chắn.

  • Những người tập trung vào bảo mật xem các trường hợp ngoại lệ là một nguồn rò rỉ thông tin ( ví dụ ). Vì hành vi mặc định của các trường hợp ngoại lệ là hiển thị thông tin đó cho người dùng, các lập trình viên đôi khi nhầm lẫn về mặt thận trọng.
  • Trong C ++, tôi đã nghe thấy các đối số chống phân bổ bộ nhớ trong các khối bắt (trong đó ít nhất là một số bối cảnh để tạo ra các thông điệp tốt). Sự phân bổ đó khó quản lý và tệ hơn, có thể gây ra ngoại lệ bộ nhớ ở đó - thường làm hỏng ứng dụng của bạn hoặc rò rỉ bộ nhớ. Thật khó để định dạng các ngoại lệ độc đáo mà không phân bổ bộ nhớ và thực tế đó có thể đã di chuyển giữa các ngôn ngữ như các lập trình viên làm.
  • Họ không biết. Ý tôi là, có những kịch bản mà mã không có ý tưởng gì đã xảy ra. Nếu mã không biết - nó không thể cho bạn biết.
  • Tôi đã làm việc ở những nơi mà các mối quan tâm nội địa hóa ngăn chặn việc đưa các chuỗi tiếng Anh vào hệ thống - ngay cả đối với các trường hợp ngoại lệ chỉ được đọc bởi các nhân viên hỗ trợ nói tiếng Anh.
  • Một số nơi, tôi đã thấy các ngoại lệ được sử dụng giống như khẳng định hơn. Họ ở đó để cung cấp một thông điệp rõ ràng, to lớn trong quá trình phát triển rằng một cái gì đó không được thực hiện hoặc một sự thay đổi đã được thực hiện ở một nơi, nhưng không phải ở một nơi khác. Chúng thường đủ độc đáo để một thông điệp tốt sẽ được nhân đôi nỗ lực hoặc đơn giản là khó hiểu.
  • Mọi người lười biếng, lập trình viên nhiều hơn hầu hết. Chúng tôi dành ít thời gian hơn cho con đường đặc biệt hơn con đường hạnh phúc, và đây là một tác dụng phụ.

Là kỳ vọng của tôi ra khỏi dòng? Tôi có đang sử dụng Ngoại lệ sai mà tôi thậm chí nhận thấy điều này?

Có sao không Ý tôi là, ngoại lệ nên có thông điệp tốt, nhưng chúng cũng là ngoại lệ . Bạn nên dành thời gian thiết kế mã để tránh các điều kiện đặc biệt hoặc viết mã để xử lý các điều kiện đặc biệt (bỏ qua thông báo), không sử dụng chúng như một loại cơ chế phản hồi tương tác khi mã hóa. Không thể tránh khỏi việc sử dụng chúng cho mục đích gỡ lỗi, nhưng trong hầu hết các tình huống nên được giữ ở mức tối thiểu. Rằng bạn nhận thấy vấn đề này khiến tôi lo ngại rằng bạn không làm tốt công việc ngăn chặn chúng.


Tôi biết điều này đã được gắn thẻ là C nhưng tôi nên thêm rằng đoạn cuối của bạn không áp dụng cho tất cả các ngôn ngữ vì một số ngôn ngữ có thể (đúng hoặc sai) phụ thuộc rất nhiều vào việc xử lý báo cáo lỗi dựa trên ngoại lệ .
Lilienthal

1
@Lilienthal - chẳng hạn như? Không có ngôn ngữ tôi rất quen thuộc với loại điều đó thường xuyên.
Telastyn

1
Tôi nghĩ rằng câu trả lời này có rất nhiều nội dung hay, nhưng nó tránh nói điểm mấu chốt, đó là "Họ nên".
djechlin

3
Cảm ơn. Mối quan tâm của bạn là không có cơ sở (tôi hy vọng :-). Nhưng mỗi lần tôi dành một phút theo dõi thêm xuống những gì đã xảy ra ở chỗ Unit Test hoặc dành thêm thời gian phân tích mã vì logfile thiếu thông tin, tôi là một chút khó chịu bởi những tránh được crappiness của một số thư :-)
Martin Ba

ABAP độc quyền của @Telastyn Cấu trúc lớp ngoại lệ có thể chứa một thông báo, về cơ bản là một đối tượng có nghĩa là báo cáo trạng thái chương trình (thành công, thất bại, cảnh báo) cho người dùng cùng với thông báo động (đa ngôn ngữ). Tôi sẽ thừa nhận rằng tôi không biết mức độ phổ biến của loại điều này, hoặc thậm chí nếu nó được khuyến khích bằng các ngôn ngữ thì điều đó là có thể nhưng có ít nhất một trong đó thực tế phổ biến (đáng tiếc).
Lilienthal

12

Tôi không có quá nhiều kinh nghiệm về C #, hay cụ thể là C ++, nhưng tôi có thể nói với bạn điều này - các ngoại lệ do nhà phát triển viết 9 trên 10 lần hữu ích hơn bất kỳ ngoại lệ chung nào bạn từng thấy, theo giai đoạn.

Lý tưởng là có, một ngoại lệ chung sẽ chỉ cho bạn chính xác lý do tại sao xảy ra lỗi và bạn sẽ có thể khắc phục dễ dàng - nhưng thực tế, trong các ứng dụng lớn có nhiều lớp có thể đưa ra nhiều loại ngoại lệ khác nhau hoặc cùng một loại ngoại lệ, việc viết kết quả đầu ra của bạn để trả về lỗi luôn có giá trị hơn so với việc dựa vào thông báo mặc định.

Đây là cách nó phải như vậy, vì như nhiều người đã chỉ ra, một số ứng dụng không muốn gửi thông báo lỗi mà họ không muốn người dùng nhìn thấy, vì lý do bảo mật hoặc để tránh nhầm lẫn chúng.

Thay vào đó, bạn nên lường trước trong thiết kế của mình những loại lỗi nào có thể được đưa ra trong ứng dụng của bạn (và sẽ luôn có lỗi) và viết các thông báo bắt lỗi giúp bạn xác định vấn đề.

Điều này sẽ không luôn giúp bạn - bởi vì bạn không thể luôn dự đoán được thông báo lỗi nào sẽ hữu ích - nhưng đây là bước đầu tiên để hiểu ứng dụng của bạn tốt hơn trong thời gian dài.


7

Câu hỏi đặc biệt là tại sao nhiều trường hợp ngoại lệ được ném bởi "các thành phần hệ thống" (còn gọi là các lớp thư viện chuẩn) không chứa các chi tiết hữu ích.

Thật không may, hầu hết các nhà phát triển không viết các thành phần cốt lõi trong các thư viện tiêu chuẩn, cũng như các tài liệu thiết kế chi tiết hoặc cơ sở thiết kế khác nhất thiết phải được công khai. Nói cách khác, chúng ta có thể không bao giờ biết chắc chắn.

Tuy nhiên, có hai điểm chính cần lưu ý là tại sao thông tin ngoại lệ chi tiết có thể không được mong muốn hoặc quan trọng:

  1. Một ngoại lệ có thể được sử dụng bằng cách gọi mã theo bất kỳ cách nào: một thư viện tiêu chuẩn không thể đặt các ràng buộc về cách sử dụng ngoại lệ. Cụ thể, nó có thể được hiển thị cho người dùng. Xem xét một chỉ số mảng ngoài giới hạn: điều này có thể cung cấp thông tin hữu ích cho kẻ tấn công. Nhà thiết kế ngôn ngữ không biết ứng dụng sẽ sử dụng ngoại lệ ném như thế nào hoặc thậm chí đó là loại ứng dụng nào (ví dụ: ứng dụng web hoặc máy tính để bàn), vì vậy việc bỏ thông tin có thể an toàn hơn từ góc độ bảo mật.

  2. Các ngoại lệ không nên được hiển thị cho người dùng. Thay vào đó, hiển thị thông báo lỗi thân thiện và ghi nhật ký ngoại lệ vào vị trí kẻ tấn công không có quyền truy cập (nếu có). Khi lỗi được xác định, nhà phát triển nên gỡ lỗi thông qua mã, kiểm tra các khung ngăn xếp và đường dẫn logic. Tại thời điểm này, nhà phát triển có nhiều thông tin hơn một ngoại lệ có thể hy vọng sẽ có.


3
1. Dựa trên tiêu chí này, có vẻ như tùy ý thông tin là gì ("Chỉ mục nằm ngoài phạm vi", theo dõi ngăn xếp) và không (giá trị của chỉ mục) được hiển thị. 2. Gỡ lỗi có khả năng nhanh hơn và dễ dàng hơn khi biết các giá trị động có liên quan. Ví dụ, nó thường sẽ ngay lập tức cho bạn biết liệu sự cố là đầu vào rác đối với đoạn mã bị lỗi hay mã đó không xử lý chính xác với đầu vào tốt
Ben Aaronson

@BenAaronson danh tính / lớp của ngoại lệ cho chúng ta biết loại lỗi. Quan điểm của tôi là các chi tiết có thể bị bỏ qua (tức là giá trị cụ thể nào gây ra lỗi) cho bảo mật. Giá trị đó có thể được theo dõi trở lại đầu vào của người dùng, tiết lộ thông tin cho kẻ tấn công.

@Snowman Tôi hầu như không nghĩ rằng bảo mật là một sự cân nhắc khi có sẵn một dấu vết ngăn xếp đầy đủ và số chỉ mục thì không. Chắc chắn tôi hiểu kẻ tấn công đang tìm kiếm lỗi tràn bộ đệm, nhưng nhiều trường hợp ngoại lệ cũng để lại dữ liệu khá an toàn (ví dụ: bảng Oracle không được tìm thấy)
gbjbaanb

@gbjbaanb ai nói chúng ta cần hiển thị dấu vết ngăn xếp đầy đủ cho người dùng?

1
Cảm ơn đã chia sẻ cái nhìn sâu sắc đó. Cá nhân, tôi không đồng ý và nghĩ rằng các đối số bảo mật là một ngụy biện hoàn toàn, nhưng nó có thể là một lý do.
Martin Ba

4

Trước hết, hãy để tôi làm vỡ bong bóng bằng cách nói ngay cả khi thông điệp diag được tải thông tin đưa bạn đến dòng mã chính xác và lệnh phụ trong 4 giây, rất có thể người dùng sẽ không bao giờ viết nó xuống hoặc chuyển nó đến những người hỗ trợ và bạn sẽ được thông báo "Vâng, nó đã nói điều gì đó về vi phạm ... Tôi không biết nó trông phức tạp!"

Tôi đã viết phần mềm và hỗ trợ kết quả của phần mềm khác trong hơn 30 năm nay và cá nhân tôi, chất lượng hiện tại của một thông báo ngoại lệ hầu như không liên quan gì đến bảo mật, bất kể kết quả cuối cùng xảy ra như thế nào phù hợp với mô hình của họ vũ trụ, rất nhiều để làm với thực tế là rất nhiều người trong ngành của chúng tôi ban đầu được tự học, và họ không bao giờ bao gồm các bài học trong truyền thông. Có lẽ nếu chúng ta CUNG CẤP tất cả các lập trình viên mới vào vị trí bảo trì trong một vài năm mà họ phải đối phó với việc tìm ra điều gì sai, họ sẽ hiểu tầm quan trọng của ít nhất là một dạng chính xác nào đó.

Gần đây, trong một ứng dụng đang được xây dựng lại, một quyết định đã được đưa ra rằng các mã trả lại sẽ thuộc một trong ba nhóm:

  • 0 đến 9 sẽ thành công thông qua thành công với thông tin bổ sung.
  • 10 đến 99 sẽ không phải là lỗi nghiêm trọng (có thể phục hồi) và
  • 101 đến 255 sẽ là lỗi nghiêm trọng.

(100 là vì một số lý do bỏ đi)

Trong bất kỳ quy trình công việc cụ thể nào, suy nghĩ của chúng tôi đã được sử dụng lại hoặc mã chung sẽ sử dụng trả về chung (> 199) cho các lỗi nghiêm trọng, khiến chúng tôi có 100 lỗi nghiêm trọng có thể xảy ra đối với luồng công việc. Với dữ liệu khác biệt nhỏ trong tin nhắn, các lỗi như không tìm thấy tệp có thể sử dụng cùng một mã và phân biệt với các tin nhắn.

Khi mã trở lại từ các nhà thầu, bạn sẽ không tin vào sự ngạc nhiên của chúng tôi khi hầu như MỌI THỨ MỘT L ERI B FATNG LRI đã trả lại mã 101.

Tất cả những gì tôi nghĩ rằng câu trả lời cho câu hỏi của bạn là những tin nhắn rất vô nghĩa bởi vì khi được tạo ra ban đầu, chúng là những phần giữ chỗ mà không ai có thể quay lại. Cuối cùng mọi người đã tìm ra cách khắc phục sự cố không phải vì các tin nhắn mà TRANH CHẤP chúng.

Kể từ đó, những người tự dạy đơn giản là không bao giờ có một ví dụ hay về những gì một ngoại lệ nên chứa. Thêm vào đó, nhiều người dùng không đọc tin nhắn, ít cố gắng chuyển nó để hỗ trợ (Tôi đã thấy các thông báo lỗi bị cắt và dán bởi mục đích sử dụng sau đó được xử lý lại trước khi gửi đi với nhận xét sau đó có vẻ như rất nhiều thông tin và tôi không thể muốn tất cả, vì vậy họ đã ngẫu nhiên loại bỏ một loạt thông tin.

Và hãy đối mặt với nó, với quá nhiều (không phải tất cả nhưng quá nhiều) của thế hệ lập trình viên tiếp theo, nếu đó là công việc nhiều hơn và không thêm flash, chỉ là không đáng ...

Lưu ý cuối cùng: Nếu một thông báo lỗi bao gồm mã lỗi / trả về, thì đối với tôi, ở đâu đó trong các mô-đun được thực thi sẽ có một dòng đọc một cái gì đó như "nếu điều kiện trả về mã-giá trị" và điều kiện sẽ cho bạn biết lý do tại sao mã trả về xảy ra. Đây có vẻ là một cách tiếp cận logic đơn giản, nhưng đối với cuộc sống của tôi, chỉ cần TRY để Microsoft cho bạn biết điều gì đã xảy ra khi nâng cấp cửa sổ không thành công trên CODE 80241013 hoặc một số định danh rất độc đáo khác. Hơi buồn phải không?


8
"... bạn sẽ không tin vào sự ngạc nhiên của chúng tôi khi hầu như MỌI NGƯỜI L ERI R FAT RÀNG đã trả lại mã 101." Bạn đúng. Tôi sẽ không tin bạn đã ngạc nhiên khi nhà thầu làm theo hướng dẫn của bạn.
Odalrick

3
chances are the users will never write it down... and you will be told "Well it said something about a violation..." Đây là lý do tại sao bạn sử dụng một công cụ ghi nhật ký ngoại lệ để tự động tạo báo cáo lỗi có chứa dấu vết ngăn xếp và thậm chí có thể gửi nó đến máy chủ của bạn. Tôi đã có một người dùng một lần mà không phải là rất kỹ thuật. Mỗi lần cô ấy gửi tin nhắn từ bộ ghi lỗi, nó sẽ xuất hiện một cái gì đó như "Tôi không chắc mình đã làm gì sai, nhưng ..." bất kể bao nhiêu lần tôi đã giải thích rằng lỗi này có nghĩa là lỗi thuộc về tôi . Nhưng, tôi luôn nhận được báo cáo lỗi từ cô ấy!
Mason Wheeler

3

Mặc dù tôi đồng ý rằng các ngoại lệ nên chứa càng nhiều thông tin càng tốt, hoặc ít nhất là ít chung chung hơn. Trong trường hợp không tìm thấy bảng, tên bảng sẽ là tốt đẹp.

Nhưng bạn biết nhiều hơn về những gì bạn đã cố gắng thực hiện tại địa điểm trong mã nơi bạn nhận được ngoại lệ. Mặc dù bạn thường thực sự không thể làm gì nhiều để khắc phục tình huống khi có sự cố xảy ra trong thư viện ngoài tầm kiểm soát của bạn, bạn có thể thêm thông tin hữu ích hơn nhiều vào tình huống có sự cố xảy ra.

Trong trường hợp không tìm thấy bảng, nó sẽ không giúp bạn nhiều nếu bạn được thông báo rằng bảng không thể tìm thấy được gọi là SINH VIÊN, vì bạn không có bảng như vậy và chuỗi đó không có trong mã của bạn.

Nhưng nếu bạn bắt được ngoại lệ và suy nghĩ lại bằng câu lệnh SQL mà bạn đang cố thực thi, bạn sẽ thấy tốt hơn, vì hóa ra bạn đã cố gắng chèn một bản ghi với trường tên là Robert '); SINH VIÊN BẢNG SINH VIÊN; (Luôn có xkcd!)

Vì vậy, để chống lại các trường hợp ngoại lệ ít thông tin hơn: hãy thử bắt lại với nhiều thông tin cụ thể hơn với những gì bạn đang cố gắng thực hiện.

Tôi có lẽ nên thêm vào, vì đây là câu trả lời nhiều hơn cho lý do tại sao trong câu hỏi, đó là lý do có thể khiến cho các nhà sản xuất thư viện không tập trung vào việc làm cho các thông điệp ngoại lệ trở nên tốt hơn, là họ không biết Tại sao một cái gì đó đã được thử mà thất bại, logic đó là trong mã gọi.


ví dụ trong C ++ bạn nên sử dụng throw_with_nestednhiều.
Miles Rout

3

Để đưa ra một câu trả lời hơi khác: Mã vi phạm có thể đã được thực hiện để chỉ định:

  • Hàm nhận X và trả về Y
  • Nếu X không hợp lệ, ném ngoại lệ Z

Thêm áp lực để cung cấp chính xác cho thông số kỹ thuật (vì sợ bị từ chối trong đánh giá / kiểm tra) trong thời gian tối thiểu và với sự ồn ào tối thiểu, sau đó bạn có công thức cho một ngoại lệ thư viện hoàn toàn tuân thủ và không có ích.


3

Các ngoại lệ có chi phí cụ thể về ngôn ngữ và triển khai.

Ví dụ, các ngoại lệ C ++ được yêu cầu để hủy tất cả dữ liệu sống giữa việc ném khung cuộc gọi và bắt khung cuộc gọi và điều đó rất tốn kém. Do đó, các lập trình viên không muốn sử dụng ngoại lệ nhiều.

Trong Ocaml, ném ngoại lệ nhanh gần bằng C setjmp(chi phí của nó không phụ thuộc vào số lượng khung cuộc gọi đi qua), vì vậy các nhà phát triển có thể sử dụng nó rất nhiều (ngay cả đối với các trường hợp không đặc biệt, rất phổ biến). Ngược lại, các ngoại lệ C ++ đủ nặng nên bạn có thể sẽ không sử dụng chúng nhiều như bạn sẽ làm trong Ocaml.

Một ví dụ điển hình là một số tìm kiếm hoặc thăm dò đệ quy có thể bị "dừng lại" bên trong một đệ quy khá sâu (ví dụ: tìm một chiếc lá trong cây hoặc hàm thống nhất). Trong một số ngôn ngữ, nhanh hơn (thành ngữ hơn) để truyền điều kiện đó đến mọi người gọi. Trong các ngôn ngữ khác, ném một ngoại lệ là nhanh hơn.

Vì vậy, tùy thuộc vào ngôn ngữ (và thói quen của các nhà phát triển sử dụng nó), một ngoại lệ có thể mang nhiều chi tiết hữu ích hoặc ngược lại được sử dụng như một bước nhảy nhanh không cục bộ và chỉ mang theo dữ liệu rất hữu ích.


6
"Ví dụ, các ngoại lệ C ++ được yêu cầu để hủy tất cả dữ liệu sống giữa việc ném khung cuộc gọi và bắt khung cuộc gọi, và điều đó rất tốn kém. Do đó, các lập trình viên không muốn sử dụng ngoại lệ nhiều." Tổng số tào lao. Sức mạnh chính của các ngoại lệ C ++ là các hàm hủy được gọi là xác định. Không ai sẽ sử dụng chúng nếu họ chỉ nhảy.
Miles Rout

Tôi biết điều đó, nhưng có một thực tế là các ngoại lệ của C ++ không giống như Ocaml và bạn không sử dụng chúng như bạn làm trong Ocaml.
Basile Starynkevitch

5
Bạn không sử dụng ngoại lệ C ++ cho luồng điều khiển trong C ++ vì làm như vậy sẽ khiến mã không thể đọc được và khó hiểu.
Miles Rout

-2

Điều gì khiến bạn nghĩ rằng giá trị chỉ mục hoặc phạm vi yêu cầu hoặc tên của bảng một chi tiết hữu ích, ngoại trừ?

Ngoại lệ không phải là một cơ chế xử lý lỗi; chúng là một cơ chế phục hồi .

Điểm của các trường hợp ngoại lệ là bong bóng đến mức mã có thể xử lý ngoại lệ. Bất cứ nơi nào mức độ đó, hoặc bạn thông tin cần thiết, hoặc nó không liên quan. Nếu có thông tin bạn cần, nhưng không có quyền truy cập ngay lập tức , bạn không xử lý ngoại lệ ở cấp độ thích hợp.

Một lần tôi có thể nghĩ về nơi thông tin bổ sung thể hữu ích là ở cấp cao nhất tuyệt đối của ứng dụng của bạn, nơi bạn gặp sự cố và phát ra lỗi kết xuất; nhưng nó không phải là công việc của ngoại lệ để truy cập, biên dịch và lưu trữ thông tin này.

Tôi không nói rằng bạn chỉ có thể đặt "ngoại lệ mới" ở mọi nơi và gọi nó là tốt, có thể viết các ngoại lệ xấu. Nhưng bao gồm thông tin không liên quan là không cần thiết để sử dụng chúng đúng cách.


Tôi sẽ không mô tả tên của bảng cơ sở dữ liệu bị thiếu là không liên quan mặc dù tôi hiểu và thông cảm với điểm bạn đang thực hiện. Tôi đã cho bạn một phiếu bầu lên.
Daniel Hollinrake

1
@DanielHollinrake Vâng, tên bảng chắc chắn là ít liên quan nhất trong các ví dụ. Trong mã tôi làm việc với, loại vấn đề này rất phổ biến và nhìn vào cách tên bảng được xử lý đưa ra manh mối cho những gì sai. Tôi đã cố gắng nghĩ về một ví dụ tại sao những điều này không liên quan đến ngoại lệ; có lẽ tôi có thể sử dụng cái này ...
Odalrick

Tôi không đồng ý. Để xử lý một ngoại lệ, các chi tiết bổ sung có thể không được yêu cầu vì bạn chỉ muốn bảo vệ ứng dụng khỏi sự cố nhưng cuối cùng bạn sẽ cần cho biết lý do tại sao nó không hoạt động và có thể khắc phục nó. Nếu bạn không có bất kỳ manh mối nào nhưng loại ngoại lệ thì nhìn tốt gỡ lỗi.
t3chb0t

@ t3chb0t Đó là những gì theo dõi ngăn xếp và lớp của ngoại lệ và kết xuất bộ nhớ và mọi thứ khác là dành cho. Nó sẽ giúp bạn như thế nào nếu một khách hàng gọi đến và nói "Máy tính cho tôi biết rằng nó đã cố truy cập vào chỉ số 5 và nó không ở đó." Nó chỉ có thể hữu ích nếu bạn cũng tuần tự hóa danh sách, và bối cảnh cho danh sách và bất cứ điều gì khác có thể hữu ích. Bạn không nên tuần tự hóa toàn bộ trạng thái của ứng dụng mỗi khi bạn ném ngoại lệ.
Odalrick

@Odalrick đối với khách hàng có thể không có ý nghĩa gì nhưng với tư cách là nhà phát triển tôi đánh giá cao mọi thông tin tôi có thể nhận được ;-) sau đó có thể là một ví dụ khác: giả sử SqlExellect xảy ra và đó là mọi thứ bạn biết ... Việc sửa chữa nó dễ dàng hơn nhiều nếu bạn biết chuỗi kết nối hoặc cơ sở dữ liệu hoặc bảng, v.v. không hoạt động .... và điều này thậm chí còn quan trọng hơn nếu ứng dụng của bạn sử dụng một số cơ sở dữ liệu. Theo dõi ngăn xếp chi tiết yêu cầu các tệp pdb được gửi cùng với ứng dụng ... không phải lúc nào cũng có thể. Ngoài ra các bãi chứa bộ nhớ có thể trở nên rất lớn và không thể luôn luôn được chuyển.
t3chb0t
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.