다음을 통해 공유


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

속성
규칙 ID CA1065
제목 예기치 않은 위치에서 예외를 발생시키지 마십시오.
범주 디자인
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

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

규칙 설명

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

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

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

속성 가져오기 메서드

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

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

이벤트 접근자 메서드

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

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

Equals 메서드

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

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

GetHashCode 메서드

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

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

인수를 GetHashCode 사용하는 버전은 .를 throw할 ArgumentException수 있습니다. 그러나 예외를 Object.GetHashCode throw해서는 안 됩니다.

ToString 메서드

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

정적 생성자

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

종료자

종료자에서 예외를 throw하면 CLR이 빠른 실패하여 프로세스가 중단됩니다. 따라서 종료자에서 예외를 throw하지 마세요.

Dispose 메서드

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

Dispose(false) 종료자에서 거의 항상 호출되므로 코드 경로는 예외 Dispose 를 throw해서는 안 됩니다.

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

메서드와 마찬가지로 Equals 같음 연산자는 예외를 true falsethrow해서는 안 됩니다.

암시적 캐스트 연산자

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

위반 문제를 해결하는 방법

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

이전에 나열된 다른 모든 메서드 형식의 경우 더 이상 예외를 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

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

참고 항목