Hậu tố Ngoại lệ về ngoại lệ trong java


19

Việc chỉ định một hậu tố của Ngoại lệ đối với các lớp ngoại lệ có cảm giác giống như mùi mã đối với tôi (Thông tin dư thừa - phần còn lại của tên ngụ ý trạng thái lỗi và nó thừa hưởng từ Ngoại lệ). Tuy nhiên, dường như mọi người đều làm điều đó và nó có vẻ là thực hành tốt.

Tôi đang tìm hiểu để hiểu tại sao đây là thực hành tốt.

Tôi đã thấy và đọc câu hỏi tại sao các ngoại lệ thường có ngoại lệ hậu tố trong tên lớp

Câu hỏi dành cho PHP và trong khi các câu trả lời có thể hợp lệ cho Java. Có bất kỳ đối số khác hoặc nó thực sự đơn giản như phân biệt rõ ràng chúng?

Nếu chúng ta lấy các ví dụ từ câu hỏi trước - thực sự có thể có các lớp trong java với tên FileNoFoundkhông phải là ngoại lệ không? Nếu có thể, nó có bảo đảm với nó Exceptionkhông?

Nhìn vào một hệ thống phân cấp nhanh chóng trong nhật thực Exception, chắc chắn, phần lớn trong số chúng có hậu tố ngoại lệ, nhưng có một vài trường hợp ngoại lệ. javassistlà một ví dụ về một thư viện dường như có một vài ngoại lệ mà không có hậu tố - ví dụ BadByteCode, BadHttpRequestv.v.

BouncyCastle là một lib khác với các ngoại lệ như CompileError

Tôi đã loay hoay một chút cũng như có ít thông tin về chủ đề này.


2
"Tất cả các ngoại lệ có mang Exceptionhậu tố hay chúng ta nên tạo ngoại lệ cho các ngoại lệ đặc biệt?" ;)
tdammers

2
Trên thực tế, Lỗi giống như Ngoại lệ (xem OutOfMemoryError) nhưng chúng có nghĩa là dành cho những thứ khó phục hồi (vì vậy bạn hầu như không bao giờ xử lý chúng)
ratchet freak

1
Ngoài ra, tôi đã nghe nói rằng theo quy tắc chung, 'các lớp nên là danh từ và phương thức nên là động từ (hành động)'. FileNotFound ArrayIndexOutOfBoundsOutOfMemoryđược quan sát / mô tả nhiều hơn, nhưng sau đó được áp dụng cho danh từ Exception.
MikeTheLiar

Câu trả lời:


27

Câu trả lời của Landei là một câu trả lời hay, nhưng cũng có câu trả lời về ngữ pháp. Tên lớp nên là danh từ . "OutOfMemory" là gì? "FileNotFound" là gì? Nếu bạn nghĩ "Exception" là danh từ, thì mô tả là tính từ chỉ định nó. Nó không chỉ là bất kỳ Exception, đó là một FileNotFoundException. Bạn không cần phải bắt OutOfMemorynhiều hơn bạn đến cửa hàng để mua "màu xanh".

Điều này cũng hiển thị nếu bạn đọc mã của mình dưới dạng câu: " Tryđang làm ... và catch OutOfMemory Exceptions"


1
Để trích dẫn bài viết "Cố gắng sử dụng danh từ vì một lớp thường đại diện cho một cái gì đó trong thế giới thực". Nhưng ngoại lệ có rơi vào trường hợp này? Đối với tôi, chúng giống như một vật phẩm lập trình, đại diện cho một thông báo lỗi. "Bạn sẽ nhận được một OutOfMemoryngoại lệ" đọc tốt hơn "Bạn sẽ có một OutOfMemoryExceptionngoại lệ", phải không?
greg0ire

1
@ greg0ire - Bạn nên thử nó là "Bạn sẽ nhận được một OutOfMemoryException." Điều đó nói rằng, chúng tôi cũng có số PIN và máy ATM, vì vậy một ngoại lệ OOME sẽ không được không bình thường.
Bobson

Tôi nghĩ rằng điểm bạn đang thực hiện ở đây thực sự là điểm tốt nhất (điểm về xung đột tên không còn tồn tại nữa nhờ vào không gian tên, ít nhất là trong php). Tôi có nhiều điều để nói về tất cả những điều này, và sẽ đăng câu trả lời sớm.
greg0ire

Làm xong! Bạn nghĩ sao?
greg0ire

@Bobson Tôi khuyên bạn nên đọc Vương quốc danh từ . Chúng ta không cần mọi thứ để trở thành một danh từ. Tại sao "bạn sẽ nhận được một OutOfMemoryException" khi nó chỉ đơn giản có thể được "bạn đang ra khỏi bộ nhớ"? Chúng tôi không sử dụng Classhậu tố ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli

6

Tôi nghĩ rằng các trường hợp ngoại lệ (và lỗi và về mặt lý thuyết khác Throwable) khác với những thứ như giao diện hoặc enum (thường không được sử dụng như hậu tố): Chúng thường có mục đích rất rõ ràng và hạn chế, chúng được sử dụng với các cấu trúc ngôn ngữ chuyên ngành ( try, catch, throw, throws) và làm theo quy tắc đặc biệt (ví dụ như kiểm tra vs trường hợp ngoại lệ được kiểm soát, không có generics). Theo một cách nào đó, chúng không chỉ là các lớp xảy ra được sử dụng như ngoại lệ, mà là một cơ chế ngoại lệ được thực hiện bằng phương tiện của các lớp.

Vì vậy, nếu bạn xử lý một ngoại lệ và không nhận ra nó như vậy, thường thì có gì đó không đúng (một lần nữa không phải là trường hợp đối với những thứ như enums hoặc giao diện). Vì vậy, tôi nghĩ rằng những khác biệt này đối với các lớp "bình thường" là đủ lớn để gọi cho một đầu mối trực quan.


1
Âm thanh tự mâu thuẫn với tôi. Nếu các trường hợp ngoại lệ là đặc biệt và được sử dụng theo những cách đặc biệt và rõ ràng dễ nhận biết, tại sao bạn cần một đầu mối trực quan cho?
Michael Borgwardt

@MichaelBorgwardt - Tôi nghĩ rằng anh ấy nói rằng vì chúng đặc biệt và được sử dụng theo những cách đặc biệt, nên chúng phải có đầu mối trực quan để có thể nhận ra rõ ràng. Điều đó đang được nói, tôi không biết liệu bạn thậm chí có thể ném thứ gì đó không được kế thừa từ ExceptionJava hay không - bạn không thể trong C #. Nếu bạn không thể, thì tôi không thể nghĩ ra một kịch bản mà bạn sẽ "xử lý một ngoại lệ và [không] nhận ra nó như vậy".
Bobson

Bạn cũng không thể ném non- Throwables vào Java. Tuy nhiên, bạn có thể xử lý ngoại lệ không chỉ trong try- catchcài đặt, ví dụ: bạn có thể thu thập ngoại lệ khi bạn thực hiện một số loại xác thực cho các đối tượng phức tạp (khi bạn muốn biết tất cả các vấn đề liên quan, không chỉ vấn đề đầu tiên). Trong những trường hợp như vậy, bạn nên lưu ý rằng bạn có thể ví dụ như ném lại những thứ bạn có trong danh sách của bạn, vì vậy sẽ rất tệ nếu gọi chúng tức là ValidationIssuethay vì ValidationException.
Landei

0

Tuy nhiên, dường như mọi người đều làm điều đó và nó có vẻ là thực hành tốt.

Vâng, tất cả mọi người thực sự làm điều đó, vì vậy nó là một thực hành, nhưng nó vẫn tốt? Một số người đang đặt câu hỏi rằng:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Hậu tố ngoại lệ § bối cảnh: php)
  • video được liên kết, https://vimeo.com/album/2661665/video/74316116 (bỏ qua đến 53:00, bối cảnh: php), truyền cảm hứng cho bài viết và đưa ra quan điểm rằng mỗi khi bạn sử dụng một ngoại lệ, bạn có một từ khóa đã cho thấy nó là một ngoại lệ gần đó
  • http://verraes.net/2013/10/verbs-in- class-name / cho thấy cách phát biểu trong câu trả lời của @Bobson có thể không tuyệt đối và đưa ra quan điểm rằng đôi khi hậu tố là tốt, cho ứng dụng hoặc ngoại lệ ở cấp cơ sở hạ tầng và đôi khi bạn nên cố gắng lưu các ký tự được lấy bởi hậu tố dài này để diễn tả một cái gì đó chính xác và có ý nghĩa hơn. Điểm này chỉ có ý nghĩa nếu bạn sử dụng một ngôn ngữ trong đó văn hóa là sử dụng ngoại lệ cho các vi phạm quy tắc kinh doanh.
  • các SO tạo đường link mà bạn cung cấp làm cho điểm về xung đột tên, nhưng bây giờ, chúng tôi có không gian tên, chúng ta không?

Đây là một câu hỏi java , không phải là một câu hỏi php . Thành ngữ là khác nhau giữa các ngôn ngữ. Điều đó nói rằng, tôi mạnh mẽ không đồng ý với câu nói này từ liên kết thứ ba của bạn: "Ngoại lệ có thể tương tự như sự kiện, ... với sắc thái mà nó là một sự kiện không mong muốn, một cảnh báo rằng một số hoạt động không phù hợp với, ví dụ, các quy tắc kinh doanh đang có hiệu lực. " Có thể PHP khác về điều này, nhưng theo tôi, các ngoại lệ được cho là đặc biệt. Nếu một quy tắc kinh doanh bị vi phạm theo bất kỳ cách nào được mong đợi, logic thông thường của bạn sẽ xử lý nó - đó không phải là ngoại lệ đối với hành vi thông thường.
Bobson

Bạn có thể đúng ở chỗ nó thay đổi trên cơ sở ngôn ngữ trên mỗi ngôn ngữ: xem chủ đề này về python: gossamer-threads.com/lists/python/python/796627 . php và python rõ ràng không tập trung vào hiệu năng, có lẽ tại sao lại có sự khác biệt này với java (tập trung vào hiệu năng, phải không?). Nếu bạn có một vài lớp để vượt qua ngăn xếp cuộc gọi của mình trước khi ở mức phù hợp để xử lý vi phạm quy tắc kinh doanh đúng cách, ngoại lệ là IMO tốt nhất. Nó cũng làm cho các kiểu trả về phù hợp hơn (bạn trả về luôn cùng loại, không sai hoặc đúng). Tôi sẽ chỉnh sửa câu trả lời của mình vào tài khoản
greg0ire
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.