예외의 세분성


9

나는 같은 그들은 일반적으로 예외를 선호하는 몇 친구들과 나 사이의 논쟁으로 실행했습니다 ClientErrorExceptionServerErrorException내가 일을 더 구체적인을 선호하는 반면, 예외의 필드와 세부 사항. 예를 들어 다음과 같은 몇 가지 예외가있을 수 있습니다.

  • BadRequestException
  • AuthenticationFailureException
  • ProductNotFoundException

이들 각각은 API에서 반환 된 오류 코드를 기반으로 작성되었습니다.

예외의 장점에 따라 이것은 Java에 관용적 인 것처럼 보입니다. 그러나 내 친구의 의견은 드문 일이 아닙니다.

코드 가독성 및 API 유용성 측면에서 선호되는 방법이 있습니까?


링크 한 페이지가 Google에서 얻을 수 있는 가장 확실한 답변 일 것입니다. 당신은 정말 의견을 요구하고 있습니다. 내 경험과 의견이 무엇인지 대답 할 수 있지만 객관적인 답변은 아닙니다.
marstato

@marstato는 공평합니다. 나는 내 입장에서 정당성을 찾고 있다고 생각합니다. 나는 내가 물건을 더 쉽게 사용할 수 있다는 것을 의미한다면 가이드를 따르기보다는 내가 작성한 라이브러리에서 사람들이 기대하는 것을 유지하고 싶습니다.

전적으로 동의합니다. 예외 클래스도 세분화되어 있습니다. 또한 abstractgetter 메소드를 사용하여 예외 클래스를 정의 하고 일반화 한 다음 세분화 된 클래스를 일반 클래스로 확장 할 수 있습니다. 예 AuthenticationFaliureException extends ClientErrorException. 이런 식으로 모든 사용자는 예외 처리 방법을 선택할 수 있습니다. 그래도 더 효과가 있습니다. 그러나 (라이브러리 대신) 응용 프로그램을 작성할 때 다른 상황 IMHO입니다. 이 경우 단순화를 위해 예외를 필요한 것보다 더 세분화하지는 않습니다.
marstato

@marstato 그것이 실제로 구현하는 방법입니다. 동의합니다. 나는 밤새 질문을 열어 놓을 것이지만, 적어도 당신을 초록색으로 확인할 수 있도록 게시물로 통합 해주세요

답변:


15

많은 다른 예외 클래스를 갖는 것과 오류 텍스트에 더 자세한 정보를 가진 소수의 클래스를 갖는 것의 주요 차이점은 많은 다른 예외 클래스가 호출 코드가 다른 종류의 오류에 다르게 반응하도록 허용한다는 것입니다. 소수의 클래스만으로 모든 종류의 예외를 균일하게 처리 할 수 ​​있습니다.

이것은 일반적으로 트레이드 오프입니다. 상속을 사용하여 어느 정도 완화 할 수 있습니다 (일반적으로 모든 것을 포착하고 기록하려는 발신자의 경우 일반 기본 예외 클래스, 다른 반응이 필요한 발신자의 경우 기본 클래스에서 파생 된 예외). 주의하지 않고 YAGNI 원칙을 고수하면 불필요한 복잡성이 많이 발생합니다. 따라서 안내 질문은 여기에 있어야합니다.

  • 코드의 호출자가 다른 제어 흐름과 함께 다른 종류의 오류에 대해 다르게 반응 할 것으로 기대하십니까?

이것에 대한 하나의 크기에 맞는 솔루션은 없으며, 모든 곳에서 적용 할 수있는 브레인 데드 "모범 사례"는 없습니다. 이 질문에 대한 답변은 어떤 종류의 소프트웨어 또는 구성 요소를 디자인 하느냐에 따라 크게 달라집니다.

  • 일부 응용 프로그램, 귀하 또는 팀이 귀하의 통제하에 전체 코드 기반을 가지고 있습니까?

  • 또는 잠재적 인 발신자를 모두 모르는 타사의 일부 재사용 가능한 구성 요소입니까?

  • 다른 종류의 오류가 전체 시스템을 즉시 중단하지 않아야하며 다른 종류의 오류 완화가 필요할 수있는 장기 실행 서버 응용 프로그램?

  • 사용자에게 오류 메시지를 표시 한 다음 프로세스를 다시 시작하기에 충분한 오류가 발생하는 짧은 응용 프로그램 프로세스?

따라서 구성 요소의 잠재적 호출자에 대해 더 많이 알수록, 실행에 대한 정확한 세부 사항 레벨을 더 잘 결정할 수 있습니다.


3
"코드의 호출자가 다른 제어 흐름과 함께 다른 종류의 오류에 대해 다르게 반응 할 것으로 기대하십니까?" 이것은 좋은 질문입니다. 고마워, 나는 이것을 기억할 것이다.

이것은 내가 생각하는 좋은 대답이며, 클라이언트 응용 프로그램이 예외 발생 설계를 주도하게 할 필요성을 더욱 강조 할 것입니다. 예외 계층 구조로 구축하는 것이 합리적이라고 생각할 수있는 일반화조차도 클라이언트 응용 프로그램 (직접 작성하지 않은 경우)이 처리기를 일반화하도록 선택할 수있는 방식과 일치하지 않을 수 있습니다. 서로 다른 요구 사항을 가진 둘 이상의 클라이언트 응용 프로그램이있는 경우 균형을 맞추는 것은 사용자의 몫입니다.
magicduncan

1

대답은 우리가 말하는 오류보고 수준에 따라 다릅니다.

일반적으로 나는 당신의 친구들과 동의하는데, 문제의 원인을 전달하는 데 필요한 것보다 더 세분화해서는 안됩니다.

null 참조 (NullReferenceException)에 대해 잘 알려진 일반적인 예외가있는 경우 고유 한 MyObjectIsNullException을 생성해서는 안됩니다. 그것은 단지 인간 통역사에게 혼란의 층을 추가 할 것입니다.

근본 원인을 다루는 사전 정의 된 예외가 없다는 특별한 예외가있는 경우에만 자신을 작성해야합니다.

그러나 거기서 멈추지 않아도됩니다. 일반적인 오류는 구성 요소 중 하나에서 발생할 수 있으며 문제가 있었다 전달 할 수 있습니다 구성 요소에가 . 그래서 무엇이 잘못 됐는지뿐만 아니라 어디에서도. 그런 다음 MyComponentException에서 첫 번째 예외를 래핑하는 것이 적절합니다. 그것은 당신에게 두 세계의 최고를 줄 것입니다.

먼저 구성 요소에 문제가 발생한 것이 분명합니다. 하단 레버에서 구체적인 원인은 내부 예외입니다.


공정 해. 그래서 좋은 예외가 이미 존재할 때 새로운 예외를 발명하지 말라고 제안하고 있습니까?

@rec 예, 모든 사람들이 미리 정의 된 것을 이미 알고 있기 때문입니다. 그것이 그들이 거기있는 것입니다.
Martin Maat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.