에러
An unexpected event that occurs during the execution of a program and disrupts the normal flow.
— 국제 전산 아카이브 규정에서 밝히는, 프로그램 가동 흐름을 일시적 혹은 영구적으로 파괴하고 정지시키는 치명적 이탈 예외 상태
잘 대처해 둔 에러는 친절한 사용자 메시지가 되지만, 방치된 에러는 프로그램 강제 강등 종료와 사장님의 고함 섞인 전화를 동반하는 시한폭탄. 분명히 콘솔에 'NullPointerException'이라고 당당하게 자백하고 있는데도, 내 눈에는 보이지 않아 모니터 속으로 빨려 들어갈 듯 노려보게 만드는 공포의 메신저(...)
1. 개요
프로그램의 컴파일 타임이나 실시간 실행(런타임) 중에 규칙을 위반하는 기형적인 상황이 터져 정상적인 실행 흐름이 뚝 끊기고 강제로 비정상 종료되는 예외 및 고장 상태. 사람이 고심해 고칠 수 있는 논리적 구멍인 버그와 달리, 하드웨어 장벽이나 파일 디스크립터 한도 바닥, 네트워크 폭사 등 외부 전산 인프라 오작동까지 전방위적으로 아우른다.
2. 컴파일 에러(Compile)와 런타임 에러(Runtime)
전산학의 에러 계보는 크게 시간 축에 따라 두 개의 무자비한 심판관으로 양분된다.
- 컴파일 에러(Compile Error): 소스코드를 바이너리로 번역(빌드)하는 과정에서 문법이 어긋나 터지는 에러이다. TypeScript나 Java 같은 정적 타입 언어를 쓸 때 많이 마주치며, 개발자의 코딩 멍청함을 실시간으로 짚어주며 빌드 자체를 칼같이 차단하지만, 실행되기도 전에 미리 잡을 수 있어 소프트웨어 공학의 '가장 착하고 축복받은 에러'로 받들어진다.
- 런타임 에러(Runtime Error): 문법을 완벽히 통과해 정상 빌드된 프로그램이 하드웨어 상에서 맹렬히 돌다가, 사용자가 변태적인 값을 입력하거나 갑자기 인터넷이 뚝 끊기는 순간 기습적으로 터져 사망하는 에러이다. 예외 처리가 비어 있으면 그 즉시 프로그램이 시커먼 비명 로그를 뿜으며 자비 없이 강제 셧다운 폭사당하는 끔찍한 성격을 가졌다.(...)
3. 방어막의 정수: try-catch-finally 예외 처리
프로그램이 예외 에러 한 방에 속절없이 승천하는 참사를 막기 위해, 위대한 전산학자들은 예외 처리(Exception Handling) 메커니즘을 창안했다. 위험천만하고 꼬이기 쉬운 네트워크 다운로드나 DB 커넥션 코딩 구역을 try 블록이라는 단단한 방어막 성벽으로 감싸 안는다. 만약 그 내부 구동 중 에러가 뿜어 나오면, 프로그램은 곧장 폭사당하지 않고 곧바로 비상 대피 통로인 catch 블록으로 떨어져 에러 로그를 남기고 정상적인 차선책 실행 흐름을 수리한다. 마지막 finally 블록은 에러가 터지든 말든 100% 무조건 실행되어, 열어두었던 무거운 DB 접속 빨대 파이프를 강제로 회수 청소하는 뒤처리 청소부 역할을 집행한다.
4. 관련 밈 및 드립
4.1. 에러 메시지를 읽지 않는 마법사들
브라우저 개발자 도구나 컴파일러 콘솔창에 빨간색 텍스트로 '35번째 줄의 변수 target이 선언되지 않았습니다(ReferenceError)'라고 너무나 명명백백하게 에러 원인을 친절하게 자백하고 있는데도, 빨간색 글씨는 무조건 아득한 외계어 취급을 갈기며 즉각 눈을 질끈 감아버리는 주니어 개발자들의 기괴한 시각 차단 증후군이다. 이들은 침착하게 빨간 글씨 세 줄만 읽으면 5초 만에 수리될 버그를 해결하려 3시간 동안 스택오버플로우 우주 미아가 되곤 한다.(...)
5. 여담
- Null Pointer Exception (NPE): 전 세계 거의 모든 객체지향 자바 개발자들의 대퇴부를 사정없이 걷어차는 악마의 에러이다. 실물 메모리 알맹이 인스턴스 주소가 존재하지 않는 깡통 변수(
null)를 가리키며 '데이터 좀 가져와라' 하고 뻔뻔하게 메소드를 호출하다가 런타임에 참사 사망하는 지독한 단골 예외이다. - 에러와 예외(Exception)의 엄밀한 차이: 전산학에서 에러(Error)는 메모리 부족(OOM), 블루스크린처럼 프로그램 수준에서 도저히 손쓸 방도가 없는 하드웨어 파탄 상태를 말하며, 예외(Exception)는 파일 누락, 네트워크 끊김처럼 개발자가 미리 catch 방어벽을 쳐두면 프로그램 수명을 끊지 않고 정상 심폐소생 시킬 수 있는 수준의 가벼운 골칫거리를 일컫는다.
- Hamming Code의 기적: 통신 및 메모리 전자기 신호 전송 시 지구 우주 방사선 등의 간섭 때문에 비트
0이1로 제멋대로 왜곡되는 물리적 하드웨어 에러가 터진다. 리처드 해밍은 전송 데이터 중간에 똑똑한 검증 비트를 믹스하여, 기계가 스스로 망가진 에러 비트를 실시간 탐지하고 자동으로 원래 비트로 정상 수리해 내는 해밍 코드를 발명해 전산학계를 통째로 구원했다.