[39] function과 action 내에서는 예외가 발생하지 않도록 하라

다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.

 

 

일련의 값을 순차 처리하는 코드에서 중간지점에서 오류가 난다면 예외 발생 지점을 파악하기 어렵다.

특히나 시퀀스 내 요소의 값을 직접 수정하는 경우 루틴 수행 이전으로 원복 하기는 매우 어렵다.

 

메서드가 절대로 예외를 유발하지 않도록 하려면 어떻게 해야할까?

우선 생각해볼 수 있는 건 단순하게 예외가 발생할 상황을 필터링하는 것이다.

allEmployees.FindAll(
    e => e.Classification == EmployeeType.Active).
    ForeEach(e => e.MonthlySalary *= 1.05M);

하지만 이는 예상 가능한 오류에 대해서만 처리가 가능하다.

 

예외가 발생하지 않도록 작성하는 것이 불가능한 경우라면,

원본 시퀀스의 복사본으로 알고리즘을 수행하고 정상 완료된 경우에 시퀀스를 대체하는 방법이 있다.

var updates = (from e in allEmployees
               select new Employee
               {
                   EmployeeID = e.EmployeeID,
                   Classification = e.Classification,
                   YearsOfService = e.YearsOfService,
                   MonthlySalary = e.MonthlySalary *= 1.05M
               }).ToList();

 

이 경우 코드의 양이 늘어나며 성능에도 영향을 미칠 수 있지만,

기존의 데이터를 수정하는 대신 새로운 데이터를 생성하도록 작성한다면

작업 완료를 확인할 기회가 생길 뿐만 아니라 문제가 생길 경우 프로그램의 상태를 변경하지 않기에 안전하다.

 

결론

 예외에 대해 방어적으로 프로그래밍하고자 한다면

 시퀀스를 별도로 복사해서 알고리즘을 처리한 뒤 대체하도록 하자. 

 

 

댓글

Designed by JB FACTORY