다음을 통해 공유


예기치 않은 위치에서 예외를 발생시키지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotRaiseExceptionsInUnexpectedLocations

CheckId

CA1065

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

예외를 throw하지 않아야 하는 메서드가 예외를 throw했습니다.

규칙 설명

예외를 throw하지 않아야 하는 메서드는 다음과 같은 범주로 나눌 수 있습니다.

  • Property Get 메서드

  • 이벤트 접근자 메서드

  • Equals 메서드

  • GetHashCode 메서드

  • ToString 메서드

  • 정적 생성자

  • 종료자

  • Dispose 메서드

  • 같음 연산자

  • 암시적 캐스트 연산자

다음 단원에서는 이러한 메서드 형식에 대해 설명합니다.

Property Get 메서드

속성은 기본적으로 스마트 필드입니다. 따라서 속성은 가능한 한 필드처럼 작동합니다. 필드는 예외와 속성을 throw하지 않습니다. 예외를 throw하는 속성이 있는 경우 이 속성을 메서드로 사용하는 것이 좋습니다.

Property Get 메서드에서는 다음 예외를 throw할 수 있습니다.

이벤트 접근자 메서드

이벤트 접근자는 예외를 throw하지 않는 간단한 연산이어야 합니다. 이벤트 처리기를 추가하거나 제거할 때 이벤트에서 예외를 throw하지 않아야 합니다.

이벤트 접근자에서는 다음 예외를 throw할 수 있습니다.

Equals 메서드

다음 Equals 메서드는 예외를 throw하지 않아야 합니다.

Equals 메서드는 예외를 throw하지 않고 true 또는 false를 반환해야 합니다. 예를 들어 일치하지 않는 두 형식이 Equals에 전달되면 ArgumentException을 throw하지 않고 단순히 false를 반환해야 합니다.

GetHashCode 메서드

다음 GetHashCode 메서드는 일반적으로 예외를 throw하지 않아야 합니다.

GetHashCode는 항상 값을 반환해야 합니다. 이렇게 하지 않으면 해시 테이블의 항목이 손실될 수 있습니다.

인수를 사용하는 GetHashCode의 버전은 ArgumentException을 throw할 수 있습니다. 그러나 Object.GetHashCode는 예외를 throw하지 않아야 합니다.

ToString 메서드

디버거는 Object.ToString을 사용하여 문자열 형식의 개체에 대한 정보를 표시합니다. 그러므로 ToString은 개체의 상태를 변경하지 않고 예외를 throw하지 않아야 합니다.

정적 생성자

정적 생성자에서 예외를 throw하면 현재 응용 프로그램 도메인에서 해당 형식을 사용할 수 없습니다. 정적 생성자에서 예외를 throw하려면 보안 문제 같은 합당한 이유가 있어야 합니다.

종료자

종료자에서 예외를 throw하면 CLR이 빨리 실패하고 이로 인해 프로세스가 종결됩니다. 따라서 종료자에서는 항상 예외를 throw하지 않아야 합니다.

Dispose 메서드

IDisposable.Dispose 또는 [M:System.IDisposable.Dispose(bool disposing)] 메서드는 예외를 throw하지 않아야 합니다. Dispose는 finally 절에서 정리 논리의 일부로 호출되는 경우가 많습니다. 그러므로 Dispose에서 예외를 명시적으로 throw하면 사용자가 finally 절 내에서 예외 처리를 추가해야 합니다.

Dispose(false) 코드 경로는 거의 항상 종료자에서 호출되므로 예외를 throw하지 않아야 합니다.

같음 연산자(==, !=)

같음 연산자는 Equals 메서드와 마찬가지로 true 또는 false를 반환하고 예외를 throw하지 않아야 합니다.

암시적 캐스트 연산자

사용자는 암시적 캐스트 연산자가 호출되었음을 인식하지 못하는 경우가 많으므로 암시적 캐스트 연산자가 throw하는 예외는 전혀 예상할 수 없습니다. 그러므로 암시적 캐스트 연산자에서는 예외를 throw하지 않아야 합니다.

위반 문제를 해결하는 방법

속성 getter의 경우 예외를 throw할 필요가 없도록 논리를 변경하거나 속성을 메서드로 변경합니다.

위에 나열된 다른 모든 메서드 형식의 경우 예외를 throw할 필요가 없도록 논리를 변경합니다.

경고를 표시하지 않는 경우

위반이 throw된 예외가 아닌 예외 선언으로 인한 것인 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.

관련 규칙

exception 절에서 예외를 발생시키지 마십시오.

참고 항목

기타 리소스

디자인 경고