자바 예외에 대한 접미사 예외


19

예외 클래스에 예외 접미사를 지정하면 코드 냄새가 나는 것처럼 느껴집니다 (중복 정보-나머지 이름은 오류 상태를 암시하며 예외에서 상 속됨). 그러나 모든 사람들이 그렇게하는 것처럼 보이며 좋은 습관 인 것 같습니다.

이것이 왜 좋은 습관인지 이해하려고합니다.

이미 예외가 클래스 이름에 접미사 예외가있는 이유를 이미 읽었습니다.

질문은 PHP에 대한 것이고 응답은 아마도 Java에 유효 할 것입니다. 다른 주장이 있습니까? 아니면 명백하게 구분하는 것만 큼 간단합니까?

이전 질문에서 예제를 가져 오면 FileNoFound예외가 아닌 이름 을 가진 Java 클래스가 실제로있을 수 있습니까? 가능한 경우 접미사로 보증 Exception합니까?

이클립스에서 빠른 계층 구조를 살펴보면 Exception대다수의 예외에는 접미사가 있지만 몇 가지 예외가 있습니다. javassist예를 들면 - 접미사없이 몇 가지 예외를 갖고있는 것 같아요 라이브러리의 예입니다 BadByteCode, BadHttpRequest

BouncyCastle 다음과 같은 예외가있는 또 다른 lib입니다. CompileError

주제에 대한 정보가 거의 없어서 조금만 봤습니다.


2
"모든 예외가 Exception접미사를 포함 해야합니까 , 예외적 인 예외에 대해 예외를 만들어야합니까?" ;)
tdammers 2013

2
실제로 Error는 Exception과 비슷하지만 (OutOfMemoryError 참조) 복구하기 어려운 것들을 의미합니다 (따라서 거의 다루지 않습니다)
ratchet freak

1
또한, 나는 일반적으로 '클래스는 명사이어야하고 메소드는 동사 (동작)'이어야한다고 들었습니다. FileNotFound ArrayIndexOutOfBounds그리고 OutOfMemory더 관찰 / 설명입니다,하지만 명사에 적용됩니다 Exception.
MikeTheLiar 2019

답변:


27

Landei의 대답은 좋은 것이지만 문법적인 대답도 있습니다. 클래스 이름은 명사 여야합니다 . "OutOfMemory"는 무엇입니까? "FileNotFound"는 무엇입니까? "예외"를 명사로 생각하면 설명자가 형용사를 지정합니다. 그냥 어떤 아니다 Exception그것은이다, FileNotFoundException. 당신은 OutOfMemory"파란색"을 구입하기 위해 가게에 갈 것보다 더 이상 을 잡을 필요가 없습니다 .

코드를 문장으로 읽는 경우에도 나타납니다 : " Trydoing ..., and catch OutOfMemory Exceptions"


1
"클래스는 일반적으로 현실 세계에서 무언가를 표현하기 때문에 명사를 사용하려고합니다"기사를 인용하십시오. 그러나이 경우에 예외가 있습니까? 나를 위해, 그들은 오류 메시지를 나타내는 프로그래밍 인공물과 비슷합니다. " OutOfMemory예외 가있을 것"이 " OutOfMemoryException예외 가있을 것"보다 더 잘 읽 습니까?
greg0ire

1
@ greg0ire-당신은 "를 얻을 것이다 OutOfMemoryException." 즉, PIN 번호와 ATM 기계도 있으므로 OOME 예외는 그렇게 드문 일 이 아닙니다 .
밥슨

나는 당신이 여기에서하고있는 요점이 실제로 최고라고 생각합니다 (이름 충돌에 관한 것은 적어도 PHP에서 네임 스페이스 덕분에 더 이상 유지되지 않습니다). 이 모든 것에 대해 더 말할 것이 있으며 곧 답변을 드리겠습니다.
greg0ire

끝난! 어떻게 생각해?
greg0ire

@Bobson 나는 명사 왕국을 읽는 것이 좋습니다 . 명사가되기 위해 모든 것이 필요하지는 않습니다. OutOfMemoryException단순히 " 메모리 부족 "할 수 있는데 왜 " "가 표시됩니까? 우리는 Class접미사를 사용하지 않습니다 (DogClass , CatClass, XmlReaderClass, ...).
Matthieu Napoli

6

예외 (및 오류 및 이론적으로 다른 Throwable것)는 인터페이스 또는 열거 형 (일반적으로 접미사로 사용되지 않음)과는 다르다고 생각합니다. 일반적으로 매우 명확하고 제한된 목적을 가지고 있으며 특수 언어 구성 ( try, catch, throw, throws) 및 특수 규칙에 따라 (예, 체크되지 않은 예외 대에는 제네릭을 확인하지 않음). 어떤 방식으로 그들은 예외로 사용되는 클래스가 아니라 클래스를 통해 구현되는 예외 메커니즘입니다.

따라서 예외를 처리하고 그것을 인식하지 못하면 일반적으로 무언가 잘못되었습니다 (열거 또는 인터페이스와 같은 경우에는 해당되지 않음). 따라서 "정상적인"클래스와의 차이점은 시각적 단서를 요구할만큼 충분히 크다고 생각합니다.


1
나에게 자기 모순되는 소리. 예외가 특별하고 특별한 방식으로 사용되어 명백히 인식 가능하다면 왜 시각적 단서가 필요한가?
Michael Borgwardt

@MichaelBorgwardt-나는 그들이 특별하고 특별한 방법으로 사용되기 때문에 분명히 알아볼 수있는 시각적 단서가 있어야한다고 생각합니다. 즉, Java 에서 상속되지 않은 것을 던질 있는지 여부 는 Exception알 수 없습니다 .C #에서는 할 수 없습니다. 당신이 할 수 없다면, 나는 당신이 "예외를 다루고 그것을 인식하지 못하는"시나리오를 생각할 수 없습니다.
밥슨

ThrowableJava에서도 non을 던질 수 없습니다 . 그러나 try-설정 에서만 예외를 처리 할 수 ​​있습니다 catch. 예를 들어 복잡한 개체에 대해 일종의 유효성 검사를 수행 할 때 예외를 수집 할 수 있습니다 ( 첫 번째 문제뿐만 아니라 모든 관련 문제 를 알고 자하는 경우 ). 이러한 경우, 예를 들어 목록에있는 것을 다시 던질 수 있으므로, ValidationIssue대신에 전화하는 것은 좋지 않습니다 ValidationException.
Landei

0

그러나 모든 사람들이 그렇게하는 것처럼 보이며 좋은 습관 인 것 같습니다.

그렇습니다. 모두가 실제로 그렇게하므로 연습이지만 여전히 좋은가요? 여러 사람들이 다음과 같은 질문을합니다.

  • http://mnapoli.fr/approaching-coding-style-rationally/ (예외 접미사 § 컨텍스트 : php)
  • 링크 된 비디오, https://vimeo.com/album/2661665/video/74316116 건너 뛰기, 컨텍스트 : php))는 기사를 고무시키고 예외를 사용할 때마다 키워드가 있음을 강조합니다. 이미 근처에 예외임을 보여줍니다.
  • http://verraes.net/2013/10/verbs-in-class-names/ 는 @Bobson의 답변에 대한 진술이 절대적이지 않을 수있는 방법을 보여 주며 때로는 접미사가 좋은 응용 프로그램 또는 인프라 수준 예외, 때로는이 긴 접미사가 사용하는 문자를 저장하여보다 정확하고 의미있는 것을 표현해야합니다. 문화적으로 비즈니스 규칙 위반에 예외를 사용하는 언어를 사용하는 경우에만이 점이 의미가 있습니다.
  • 당신이 제공 하는 SO 링크 는 이름 충돌에 대해 지적하지만 지금은 네임 스페이스를 가지고 있습니까?

이것은 PHP 질문 이 아닌 Java 질문 입니다. 숙어는 언어마다 다릅니다. 그게 내가 말했다 강하게 세 번째 링크에서이 인용에 동의 : "예외 이벤트 유사 할 수 있습니다 ... 그것은 바람직하지 않은 경우, 경고가 있다는 뉘앙스 일부 작업은, 예를 들어, 비즈니스 규칙과 일치하지 않는 것을 그 효과가 있습니다. " 아마도 PHP는 이것과 다를 수 있지만 예외적으로 예외는 예외입니다. 비즈니스 규칙이 예상 한 방식으로 위반되는 경우 일반적인 논리가이를 처리해야합니다. 이는 정상적인 동작 의 예외 는 아닙니다 .
Bobson

언어마다 언어에 따라 다를 수 있습니다 . python에 대한이 스레드를 참조하십시오 : gossamer-threads.com/lists/python/python/796627 . php와 python은 분명히 성능 중심적이지 않으므로 java와 성능 차이가있는 이유는 무엇입니까? 비즈니스 규칙 위반을 올바르게 처리하기 위해 올바른 수준에 도달하기 전에 통화 스택에서 교차 할 계층이 여러 개인 경우 예외가 가장 좋습니다. 또한 리턴 유형을보다 일관성있게 만듭니다 (false 또는 true가 아닌 항상 동일한 유형을 리턴합니다). 나는 계정에이 내 대답을 편집합니다
greg0ire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.