Memo

[철학 시점 개발]예외를 기대한다면 그것은 정말 예외일까요?

★개발일기★ 2025. 1. 8. 17:54
반응형

예외와 예외의 본질

 

예외는 정말 예상치 못한 오류를 처리하는데 사용되어야하는지, 아니면 일반적인 흐름의 일부로도 허용되는지를 고민하게 된다.

예외의 본질은 정상적인 흐름에서 벗어난 비정상적인 상황을 처리하기 위한 구조이다.
예상할 수 없는 상황은 네트워크 오류, 파일 손실, 메모리 부족이지 않을까?

하지만 아래 두 시나리오를 보면 생각이 달라지지 않을까?

 

 

시나리오1

우리는 AI 에게 어떤 일을 시키려고 합니다.
사람 얼굴을 입력시켜서, 닮은꼴인 연예인을 찾아내는 일을 시키려고 합니다.

하지만, 어떤 사람이 강아지나, 고양이 사진을 넣었을 때 이를 예외라고 처리하여, 실행을 중단해야 할까?
우린 더 흥미로워집니다. 이 강아지 사진과 비슷한 연예인 사진이 누굴까?

당신은 사용자로써, 이 앱이 중단되지 않고 계속 실행되길 바랄겁니다.

 

 

시나리오2

우리는 자율주행 자동차를 개발하고 있습니다. 목적지를 입력하면, 최단거리를 검색하여 이동하게끔 만들었습니다.
하지만 최단거리에 있는 한 도로가 공사중이라 막혀있습니다.

하지만 자율주행 자동차는 이 길이 정상적인 방향으로 생각하여 진입한다면, 이는 예외입니다.
이 경우 예외가 발생하면 멈추는게 좋은 방향일 겁니다.

 

결론

 

이 두 시나리오는 비기술적인 요구 사항입니다.

그래서 다시 본론으로 돌아와서. 예외를 기대한다면, 그게 정말 예외일까요?
이 질문에 대한 답은 위 두 시나리오처럼 개발자가 코드  설계 시 비정상적인 흐름과 정상적인 흐름의 경계를 명확히 구분해야 함을 상기시키죠.

"예외를 기대하고 있다면, 그것은 더 이상 예외가 아니다"

예상 가능한 상황을 예외로 처리하는 습관을 피하고, 상태 기반의 로직 처리를 우선 고려해야 하죠.

예시는 다음과 같습니다.

 

1. 네트워크 요청

try {
  const response = await fetchData()
} catch (error) {
  console.error('네트워크 오류 발생:', error)
}

네트워크 요청은 현실적으로 예상 가능한 일입니다.

 

1-1. 변환된 코드

const response = await fetchData()
if (!response.ok) {
  console.error('네트워크 오류 발생:', response.statusText)
}

 

2. 사용자 입력 검증

try {
  const value = JSON.parse(userInput)
} catch (error) {
  console.error('잘못된 입력입니다.')
}

입력이 잘못될 가능성을 이미 예상하고 있습니다.

 

2-1 변환된 코드

if (isValidJSON(userInput)) {
  const value = JSON.parse(userInput)
} else {
  console.error('잘못된 입력입니다.')
}

 

종종 중요한 것은 단순히 무엇이 읽기 쉬운가이다

 

반응형