추상 예외 슈퍼 타입


17

던지기 System.Exception가 그렇게 나쁘다고 여겨 지면 왜 처음부터 Exception만들어 지지 않았 abstract습니까?

그렇게하면 전화를 걸 수 없습니다.

throw new Exception("Error occurred.");

이렇게하면 파생 된 예외를 사용하여 발생한 오류에 대한 자세한 정보가 제공됩니다.

예를 들어 라이브러리에 사용자 정의 예외 계층을 제공하려는 경우 일반적으로 예외에 대한 추상 기본 클래스를 선언합니다.

public abstract class CustomExceptionBase : Exception
{
    /* some stuff here */
}

그리고 더 구체적인 목적을 가진 일부 파생 예외가 있습니다.

public class DerivedCustomException : CustomExceptionBase
{
    /* some more specific stuff here */
}

그런 다음 라이브러리 메소드를 호출 할 때 라이브러리에서 오는 오류를 직접 잡기 위해이 일반적인 try / catch 블록을 가질 수 있습니다.

try
{
    /* library calls here */
}
catch (CustomExceptionBase ex)
{
    /* exception handling */
}

이것이 좋은 습관입니까?

Exception추상적이게 되면 좋을까요?

편집 : 내 요점은 예외 클래스가 표시 abstract되어도 여전히 모든 블록에서 잡을 수 있다는 것입니다. 이를 추상화하는 것은 프로그래머가 "슈퍼 와이드"예외를 던지지 못하게하는 방법 일뿐입니다. 일반적으로 자발적으로 예외를 던질 때 어떤 유형과 예외가 발생했는지 알아야합니다. 따라서 좀 더 구체적인 예외 유형을 던져야합니다.


3
+1 "잘못된 사용을 방지하는 가장 좋은 방법은 그러한 사용을 불가능하게하는 것입니다." - 스콧 마이어스
— 스티븐 Jeuris

3
"예외가 추상적이게되면 좋을까?" -새로운 예외 ( "...")를 사용하는 기존의 모든 .NET 코드가 작동하지 않기 때문에 절대로 그렇지 않습니다. 그러나 ".NET 팀이 처음부터 예외 초록을 만들었 을까요?" - 아마, 그래,하지만 :) 십년 너무 늦게 지금>입니다
— MattDavey

답변:


11

나는 이것이 왜 이런 식으로 수행되었는지 실제 이유를 알지 못하고, 특정 범위까지 무한한 넓은 예외가 발생하는 것을 방지하는 것이 좋습니다.

그러나 작은 데모 응용 프로그램이나 개념 증명을 코딩 할 때 10 가지 예외 하위 클래스 디자인을 시작하거나 상황에 가장 적합한 예외 클래스를 결정하기 위해 시간을 보내고 싶지 않습니다. 오히려 Exception세부 사항을 설명하는 문자열을 던져서 전달 하고 싶습니다 . 내가 한 경우 던져 - 멀리 코드, 나는 이러한 것들에 대해 걱정하지 않을 경우 강제로 그런 것들에 대해 신경, 나도 내 자신의 만들 것 GenericException수업을하고 던져 그 모든 곳에서, 또는 다른 도구 / 언어로 이동합니다. 일부 프로젝트의 경우 관련 예외 서브 클래스를 올바르게 작성하는 것이 중요하지만 모든 프로젝트에서이를 요구하는 것은 아닙니다.


나는 당신에 전적으로 동의하지만 문제는 사소한 프로젝트에 대해 암묵적으로 생각하고있었습니다.
— marco-fiset

3

가능성 A : 논리적으로 맞습니다.

Microsoft는 다른 많은 사람들과 함께 수많은 new Exception()이유로 직접 던지기를 제안하지 않는 것이 맞습니다 .

즉, Exception클래스 계층 구조 의 목적은 가장 구체적인 예외 만 포착 할 수 있도록 축소 효과를 정의하는 것이라는 학문적 이상을 고려할 수 있습니다. (즉, ArgumentNullException보다 좁습니다 ArgumentException).

Exception 클래스는 예외가 아닙니다 (pun 의도하지 않음). 범위가 무한히 넓기 때문에 거의 포착 할 수없는 "슈퍼 예외"인 가장 넓은 예외입니다. '예외' abstract예외는 그 자체로 엔티티로서 존재할 수 없다는 의미 가 아닙니다 . 좋은 사례는 아직 정의되지 않았지만 가능성 B 참조), 공개적으로 구성 가능해야한다.

'추상적 인'키워드 (순전히 학문적 의미에서)는 기본 수업 자체가 이해가되지 않는 경우에만 적용 할 수 FourLeggedAnimal있습니다.

마음이 모든, 아니있을 것입니다 기술 클래스를 만드는 이유는 abstract, 개발자 악화의 원인이 될 수있는 것보다 다른 .

가능성 B : 디자인 잠금 / 몰랐다

만약 MS가이 수업을 추상적으로 만들었다면, 언어의 기본에 매우 중요하기 때문에 길을 가다듬었다면 어려움에 처했을 수도 있습니다. 그들은 이미으로 구부러 졌으므로 ApplicationException길을 따라 권장 사항이 변경 될 것으로 예상됩니다. ( http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx 참조 )

다른 이유가있을 수 있습니다 (Reflection 또는 다른 기술적 인 이유와 관련이 있다고 생각합니다).이 게시물을 CW로 만들고 있습니다.


"그것이"슈퍼 와이드 "이기 때문에 추상적이지 않습니다." ...하지만 그것은 OP의 주장이 아닙니다. 예외 유형의 일부 표시가 항상 전달되어야한다는 의미에서 추상적이어서는 안됩니다.
— Steven Jeuris

좋은 점은 적절하게 답변을 업데이트하겠습니다. '추상'은 언어 키워드이자 논의되는 개념의 이름이기 때문에이 질문의 본질은 약간 혼란 스럽습니다.
— 케빈 맥코믹

@KevinMcCormick : 여기서 '추상'이라는 용어는 언어 키워드로 사용됩니다. 미래의 독자들에게보다 명확하게 질문을 어떻게 바꿀 수 있는지 알려주십시오.
— marco-fiset

좋은 질문이라고 생각합니다. abstract키워드 와 관련된 모든 OO 전환 이이 벽에 도달했습니다. abstract백틱으로 키워드를 표시하는 것 외에는 문제를 해결할 방법이 확실하지 않습니다 .
— 케빈 맥코믹

2
클래스를 "분산 해제"하는 것이 어떻게 중요한 변화입니까?
— 구성자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.