내 메서드가 자체 예외를 throw해야합니까, 아니면 파일이없는 경우 .NET에서 throw해야합니까?
내 코드는 다음과 같습니다.
public void ReadSomeFile(string filePath)
{
if (!File.Exists(filePath))
throw new FileNotFoundException();
var stream = new FileStream(filePath, ....)
.....
}
직접 예외를 던져야하나요 ( File.Exists수표 참조 )? 파일이 존재하지 않으면 FileStream이미 FileNotFoundException발생합니다. 여기서 좋은 프로그래밍 관행은 무엇입니까? 코드 분석은 매개 변수의 유효성을 검사해야한다고 말합니다. 그러나 해당 매개 변수를 다른 메서드 (내 또는 다른 코드)에 직접 전달하고 해당 메서드가 자체적으로 예외를 발생시키는 경우 내 코드에서 인수 유효성 검사의 이점은 무엇입니까?
if (File.Exists(f)) { DoSomething(f) }(또는 그 부정)은 안티 패턴입니다. 파일은 두 문 사이에서 삭제되거나 생성 될 수 있으므로 그렇게 존재하는지 확인하는 것은 거의 의미가 없습니다.
그 외에도 주석에서 지적했듯이 File.Exists()true를 반환 할 수 있지만 실제 파일 열기는 여러 가지 이유로 여전히 실패 할 수 있습니다. 따라서 오류 검사를 반복하고 파일을 열어야합니다.
자신을 반복하고 싶지 않고 대신 코드를 건조하게 유지하기 때문에 파일을 열고 new FileStream()던지십시오. 그런 다음 예외를 포착하고 원하는 경우 원본을 다시 던지거나 애플리케이션 별 예외를 throw 할 수 있습니다.
물론 부름 File.Exists()은 정당화 될 수 있지만이 패턴에서는 그렇지 않습니다.
귀하의 메서드가 호출 ReadSomeFile되고 filename입력으로 a 를 취 하므로 FileNotFoundException. 예외를 포착 한 다음 스스로 던져서 값을 추가 할 수 없으므로 .NET에서 예외를 발생 시키십시오.
그러나 메서드가 LoadData(databaseName)있고 많은 파일에 액세스해야하는 경우 예외를 포착하고 사용자 지정 예외를 throw하는 것이 databaseName유용 할 수 있습니다 . 다른 유용한 정보와 함께를 예외에 추가 할 수 있기 때문 입니다.
이미 주어진 답변 외에도 이것은 예상되는 일에 달려 있다고 말할 수 있습니다.
로그 파일을 읽고 싶지만 존재하지 않는 경우 오류를 발생 시키시겠습니까, 아니면 빈 문자열 (또는 빈 문자열 배열) 만 발생 시키시겠습니까?
기본값 (빈 문자열과 같은)을 반환하는 경우 함수의 내용을 a try-catch(예상 오류 만 해당)에 래핑 하고 catch블록의 실제 내용을 반환하면서 블록 의 기본값 을 반환합니다 try.
이것은 세 가지 가능한 상황을 남깁니다.
- 파일의 내용이 반환됩니다.
- 예상 오류가 발생했기 때문에 기본값이 리턴됩니다.
- 특정 오류를 포착하지 못했기 때문에 .NET에서 오류가 발생합니다.
특정 파일 이름 (예 : 장치 파일 및 UNC 경로 ) 과 같은 전체 파일 이름에 대해 전혀 모르는 상태에서 올바른 방법으로 파일을 열도록하십시오 .
경우에 따라 다른 파일 방법이 실패 할 수 있지만 파일을 성공적으로 열 수 있습니다.
특수 파일 이름의 몇 가지 예는 다음과 같습니다.
- 범죄자
- NUL
- COM1, COM2, COM3, COM4
- \\ 서버 \ 공유 \ 파일 _ 경로
- \\ teela \ admin $ \ system32 (C : \ WINNT \ system32에 도달)
- C : .. \ File.txt
- \\. \ COM1
- % TEMP %
- 그리고 더...
'program story' 카테고리의 다른 글
| matplotlib에서 두 개의 수직선 사이를 채우십시오. (0) | 2020.10.19 |
|---|---|
| 오류 : 불행히도 하나의 프로젝트에 비 Gradle Java 모듈 및> Android-Gradle 모듈을 가질 수 없습니다. (0) | 2020.10.19 |
| 밀리 초를 구문 분석하는 방법? (0) | 2020.10.19 |
| 필드 세트 너비를 컨트롤만큼 넓게 만들 수있는 방법이 있습니까? (0) | 2020.10.19 |
| Chrome에서 전체 리디렉션 경로 및 HTTP 상태 코드보기 (0) | 2020.10.19 |