CA1065: 예기치 않은 위치에서 예외를 발생시키지 마십시오.
속성 | 값 |
---|---|
규칙 ID | CA1065 |
제목 | 예기치 않은 위치에서 예외를 발생시키지 마십시오. |
범주 | 디자인 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
예외를 throw하지 않아야 하는 메서드가 예외를 throw했습니다.
규칙 설명
예외를 throw하지 않을 것으로 예상되는 메서드는 다음과 같이 분류할 수 있습니다.
- 속성 가져오기 메서드
- 이벤트 접근자 메서드
- Equals 메서드
- GetHashCode 메서드
- ToString 메서드
- 정적 생성자
- 종료자
- Dispose 메서드
- 같음 연산자
- 암시적 캐스트 연산자
다음 섹션에서는 이러한 메서드에 대해 자세히 설명합니다.
속성 가져오기 메서드
속성은 기본적으로 스마트 필드입니다. 따라서 필드는 가능한 한 필드처럼 동작합니다. 필드는 예외를 throw하지 않으며 속성도 예외를 throw하지 않습니다. 예외를 throw하는 속성이 있는 경우 해당 속성을 메서드로 만드는 것이 좋습니다.
다음 예외는 Property Get 메서드에서 throw될 수 있습니다.
- System.InvalidOperationException 및 모든 파생 항목(System.ObjectDisposedException 포함)
- System.NotSupportedException 및 모든 파생 항목
- System.ArgumentException(인덱싱된 get에서만)
- System.Collections.Generic.KeyNotFoundException(인덱싱된 get에서만)
이벤트 접근자 메서드
이벤트 접근자는 예외를 throw하지 않는 간단한 작업이어야 합니다. 이벤트는 이벤트 처리기를 추가하거나 제거하려고 할 때 예외를 throw해서는 안 됩니다.
다음 예외는 이벤트 접근자에서 throw될 수 있습니다.
- System.InvalidOperationException 및 모든 파생 항목(System.ObjectDisposedException 포함)
- System.NotSupportedException 및 모든 파생 항목
- System.ArgumentException 및 파생 항목
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
false
throw해서는 안 됩니다.
암시적 캐스트 연산자
사용자는 암시적 캐스트 연산자가 호출되었음을 인식하지 못하는 경우가 많으므로 암시적 캐스트 연산자에 의해 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
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
관련 규칙
참고 항목
.NET