개발을 시작함과 동시에 내 옆에서 딱 달라붙어 항상 날 괴롭히던 수많은 Error 들..
이제는 오히려 한참 작성한 코드가 Error 없이 잘 작동하면, 허전하고 느낌이 든다.
그렇게 날 괴롭히던 Error 들을 잘 다루기 위해, 그간 고민했던 것들을 정리해보았다.
어떻게 해야 내가 만든 프로그램에 피해 없이, Error 들과 사이좋게 지낼 수 있을까?
이 글은 단순한 Error Handling 에 대한 글이 아닌, 구조적 관점에서의 Error Handling을 다루는 글입니다.
개발을 하다보면 자연스럽게 마주하는 골칫거리 중 하나 Error 와 Exception. (두갠가?)
매번 이것들을 처리하기 급급했지만, 오늘은 이녀석들에 대해 톺아보자.
그런데 여기서 등장하는 Error 와 Exception 이 뭘까?
개념적 정의를 좀 살펴보면 아래와 같은데..
특징 | Error | Exception |
---|---|---|
발생 원인 | 시스템 오류 | 프로그래머 오류 |
예측 가능성 | 예측 불가능 | 예측 가능 |
처리 방식 | 시스템에서 자동 처리 | 프로그래머가 직접 처리 |
종류 | 스택 오버 플로우, 메모리 부족등 | null 참조, 0 으로 나누기등 |
프로그래밍적 정의를 살펴보면 언어마다 조금씩 다르지만..
언어 | Error | Exception | Etc |
---|---|---|---|
Java | Throwable | Throwable | Throwable 을 상속받은 두 객체 모두 throw 할수있음 |
C# | x | Throwable | Exception 만 throw 할수있음 |
Dart | Throwable | Throwable | 모든 객체를 throw 할수있음 |
위 내용을 종합해보면..
시스템상 오류 & 프로그램상 오류 가 발생할경우, Error 혹은 Exception 을 발생(throw)시킨다.
그러면 개발자는 try-catch
문을 통해 발생된 오류를 catch
하여 상황에 맞게 예외 처리 한다.
( 플렛폼마다 어느정도 차이는 있습니다.. )
try {
final file = File("./AwesomeFile.txt");
final data = file.readAsStringSync();
print(data);
} on FileSystemException catch (exception,stackTrace) {
// if file not exist, 'Code' throw [FileSystemException].
// Handle FileSystemException
} on OutOfMemoryError catch (e){
// if file is really Big, 'System' throw [OutOfMemoryError].
// Handle StackOverflowError
}
}
끗!
하면 좋겠지만..
그럼 어떻게 해야 예외 처리를 잘 했다고 소문이 날까?
그냥 try-catch
문만 쓰면 되는거 아니야? 라고 생각하겠지만..
타임머신을 타고 개린이 시절로 잠시 돌아가보자.. ( 대나무 헬리콥터~ )
아무것도 모르던 개린이 시절.. 뒤도 안보고 코드를 작성하곤했다.
함수 하나에 모든 비지니스 로직 & DB Query 등등 다 때려넣고,
의도대로 작동하는 코드를 보며 내심 뿌듯해 했었다.
당연히 이런 덩어리 코드에 Error 처리는 더 큰 덩어리를 만들뿐이었다.
< 아무튼 돌아가면 된거지 >
그렇게 아무 생각없이 무자비한 코딩을 하고있었다. 나는 점점 더 큰 스파게티 코드를 만들고 있었고,
결국 유지보수가 불가능 할정도의 스파게티 괴물이 탄생했다.
그리고 결정했다, 잠시 코딩을 멈추고 공부하기 시작하기로..
무엇이 문제인지 돌아보고, 이 괴물을 어떻게 물리쳐야할지 한참을 고민했다.
그렇게 한참을 고민 & 공부하고 나서야 해결책을 찾았다.
‘디자인 패턴’ 과 ‘시스템 아키텍처’.
난 이것들을 완전히 내것으로 만들기 전까지 손에서 코딩을 멈추었다.
결국 프로그램에 전체 구조를 생각하게 되었고, 계층, 관심사 분리등 여러 개념들을 알게되었다.
그렇게 프로그램에 구조를 짜게 되면서, 문득 드는 생각..
잘 생각해보시고, 다음글로 ㄱㄱ