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