다음을 통해 공유


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

속성
규칙 ID CA1065
제목 예기치 않은 위치에서 예외를 발생시키지 마십시오.
범주 디자인
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

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

규칙 설명

예외를 throw하지 않을 것으로 예상되는 메서드는 다음과 같이 분류할 수 있습니다.

  • 속성 가져오기 메서드
  • 이벤트 접근자 메서드
  • Equals 메서드
  • GetHashCode 메서드
  • ToString 메서드
  • 정적 생성자
  • Finalizer(종료자)
  • Dispose 메서드
  • 동등 연산자
  • 암시적 캐스트 연산자

다음 섹션에서는 이러한 메서드에 대해 자세히 설명합니다.

속성 가져오기 메서드

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

다음 예외는 속성 get 메서드에서 발생할 수 있습니다.

이벤트 접근자 메서드

이벤트 접근자는 예외를 throw하지 않는 간단한 작업이어야 합니다. 이벤트는 이벤트 처리기를 추가하거나 제거하려고 할 때 예외를 throw해서는 안 됩니다.

다음 예외는 이벤트 접근자에서 던져질 수 있습니다.

Equals 메소드

다음 Equals 메서드는 예외를 throw해서는 안 됩니다.

메서드는 예외를 던지는 대신 true 또는 false를 반환해야 합니다. 예를 들어 Equals에 일치하지 않는 두 형식이 전달되면, ArgumentException을 던지는 대신에 그냥 false을 반환해야 합니다.

GetHashCode 메서드

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

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

인수를 사용하는 GetHashCode의 버전은 ArgumentException 예외를 발생시킬 수 있습니다. 그러나 Object.GetHashCode은 예외를 발생시켜서는 안 됩니다.

ToString 메서드

디버거에서는 System.Object.ToString을 사용하여 개체에 대한 정보를 문자열 서식으로 표시합니다. 따라서 ToString 개체의 상태를 변경하면 안 되며 예외를 throw해서는 안 됩니다.

정적 생성자

정적 생성자에서 예외를 throw하면 현재 애플리케이션 도메인에서 형식을 사용할 수 없게 됩니다. 정적 생성자에서 예외를 throw하는 것이 좋은 이유(예: 보안 문제)가 있어야 합니다.

Finalizer(종료자)

종료자에서 예외를 throw하면 CLR이 즉시 실패하여 프로세스가 종료됩니다. 따라서 종료자에서 예외를 발생시키지 마세요.

Dispose 메서드

System.IDisposable.Dispose 메서드는 예외를 throw해서는 안 됩니다. Disposefinally 절의 정리 논리 일부로 자주 호출됩니다. 따라서 Dispose에서 예외를 명시적으로 throw하면 사용자가 절 내에 finally에서 예외 처리를 추가해야 합니다.

Dispose(false) 코드 경로는 종료자에서 거의 항상 호출되기 때문에 예외를 Dispose로 던져서는 안 됩니다.

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

Equals 메서드와 마찬가지로, 같음 연산자는 true 또는 false를 반환해야 하며, 예외를 던져서는 안 됩니다.

암시적 캐스트 연산자

사용자는 암시적 캐스트 연산자가 호출되었음을 인식하지 못하는 경우가 많으므로 암시적 캐스트 연산자에 의해 throw된 예외는 예상할 수 없습니다. 따라서 암시적 캐스트 연산자에서 예외가 던져져서는 안 됩니다.

위반 문제를 해결하는 방법

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

이전에 나열된 다른 모든 메서드 형식의 경우 더 이상 예외를 throw하지 않도록 논리를 변경합니다.

경고를 표시하지 않는 경우

규칙 위반이 예외 선언에 의해 발생한 경우, 발생한 예외로 인해 발생한 것이 아니라면 이 규칙에서 경고를 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.

#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 구성 파일에서 none의 심각도를 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

참고하기