Exception모든 예외에 대한 기본 유형이므로 매우 구체적이지 않습니다. 유용한 정보가 포함되어 있지 않기 때문에이 예외를 throw해서는 안됩니다. 예외를 포착하는 코드를 호출하는 것은 완전히 원하지 않는 다른 시스템 예외에서 의도적으로 throw 된 예외 (논리에서)를 명확하게 할 수 없으며 실제 오류를 지적 할 수 없습니다.
같은 이유가 SystemException. 파생 된 유형 목록을 보면 매우 다른 의미를 가진 수많은 다른 예외를 볼 수 있습니다.
NullReferenceException그리고 IndexOutOfRangeException다른 종류의 수 있습니다. 이제 이들은 매우 구체적인 예외는, 그래서 그들이 던지는 수 괜찮을. 그러나 일반적으로 논리에 실제 실수가 있음을 의미하므로 여전히 던지고 싶지 않을 것입니다. 예를 들어 null 참조 예외는 인 개체의 멤버에 액세스하려고 함을 의미합니다 null. 그것이 당신의 코드에서 가능성이 있다면, 당신은 항상 명시 적으로 null더 유용한 예외를 확인 하고 대신 던져야합니다 (예 ArgumentNullException:). 마찬가지로 IndexOutOfRangeExceptions는 목록이 아닌 배열에서 잘못된 인덱스에 액세스 할 때 발생합니다. 항상 처음에는 그렇게하지 않도록하고 배열의 경계를 먼저 확인해야합니다.
몇 가지 다른 예를 들어 두 같은 예외가 있습니다 InvalidCastException또는 DivideByZeroException코드에서 특정 오류에 대한 던져 일반적으로 당신이 뭔가 잘못을하고 또는 당신이 먼저 몇 가지 잘못된 값을 검사하지 않는 것을 의미하고 있습니다. 코드에서 의도적으로 던짐으로써 호출 코드가 코드의 일부 결함으로 인해 던진 것인지 또는 구현에서 무언가를 위해 재사용하기로 결정했기 때문에 발생했는지 확인하기가 더 어려워집니다.
물론 이러한 규칙에는 몇 가지 예외 (하)가 있습니다. 기존의 것과 정확히 일치하는 예외를 유발할 수있는 무언가를 빌드하는 경우, 특히 내장 된 동작과 일치시키려는 경우 자유롭게 사용하십시오. 그런 다음 매우 구체적인 예외 유형을 선택했는지 확인하십시오.
그러나 일반적으로 필요를 충족하는 (특정) 예외를 찾지 않는 한 항상 특정 예상 예외에 대한 고유 한 예외 유형을 만드는 것을 고려해야합니다. 특히 라이브러리 코드를 작성할 때 예외 소스를 분리하는 데 매우 유용 할 수 있습니다.