예외에 대한 설계 지침으로 시작하고 DO, DO NOT 및 AVOID를 포함합니다. 또한 그 이유도 제시합니다.
귀하의 예에서 관련 섹션은 래핑 예외입니다.
그리고 이런 식으로 쓰여질 것으로 기대합니다. 특정 예외를 포착하고보다 의미있는 메시지가 전달되도록 정보를 추가하려고 시도합니다. 또한 내부 예외는 여전히 로깅 목적으로 유지됩니다.
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
UPDATE
Kanini는 데이터 레이어에이 예외 블록이 있거나 파일 검사가 Business Layer에서 사용 가능한지 확인하는 것이 좋습니다.
우선 Wrapping Exceptions의 이론적 근거는 이것입니다.
하위 계층 예외가 상위 계층 작업의 맥락에서 의미가없는 경우 하위 계층에서 발생한 특정 예외를 더 적절한 예외로 래핑하는 것이 좋습니다.
따라서 상위 계층이 파일에 대해 알아야한다고 생각되면 데이터 계층은 다음과 같아야합니다
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
캐치하지 마십시오.
개인적으로 데이터 레이어가 어셈블리 리소스 인 기본 systems.xml을 사용하는 것과 같은 유용한 작업을 수행 할 수 없다면 아무것도 기록하지 않거나 예외를 줄 바꿈하는 것이 좋습니다. 로깅은 어떤 방법과 파일이 문제인지 알려줄 것입니다. ( throw ex
이 경우 또는 기본 설정 throw
도 수행하지만 값을 추가하지 않음). 즉, 일단 식별되면 문제를 신속하게 해결할 수 있습니다.
이 특정 예제와 마찬가지로 XDocument.Load에서 다음과 같은 문제가 발생하여 네 가지 예외가 발생할 수 있습니다.
- ArgumentNullException
- SecurityException
- FileNotFoundException
- UriFormatException
다음 코드가 존재하지 않고 FileNotFoundException이 발생하지 않는다는 것을 안전하게 보장 할 수는 없습니다. 단순히 존재 확인을 수행하고로드 할 때 사라질 수 있기 때문입니다. 비즈니스 계층에서 사용할 수 있으면 도움이되지 않습니다.
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
다른 프로세스가 독점적 인 파일 잠금을 가지고있는 경우이 예외가 발생하는 이유는 File.CanIOpenThis () 메소드가 없기 때문에 읽기 위해 파일을 열려고 시도 할 때까지는 오류가 발생하지 않기 때문에 SecurityException이 더욱 악화됩니다. 그리고 그러한 방법이 존재하면 여전히 File과 동일한 문제가 있습니다.