맞는 예외만 잡고, 세상 전부는 잡지 마
sqlite3 모듈은 작은 예외 계층을 던져. 이걸 알아두면 예상된 실패 — 제약 위반이나 DB가 잠긴 상황 —를 전부 싸잡아 잡지 않고 정확히 다룰 수 있어.
sqlite3.Error— 전부의 뿌리야.sqlite3.DatabaseError— 엔진 안에서 벌어진 일이야.sqlite3.IntegrityError— 제약을 어겼을 때 나와. UNIQUE, NOT NULL, FK, CHECK.sqlite3.OperationalError— 운영 쪽 문제야. 잠겨 있거나, 파일이 깨졌거나, 디스크가 찼거나.sqlite3.ProgrammingError— 네가 잘못 쓴 거야. 닫힌 cursor를 쓴다든가 parameter 개수가 안 맞는다든가.sqlite3.InterfaceError— SQLite까지 가기도 전에 드라이버 쪽에서 난 문제야.
Tip: 충돌할 수 있는 INSERT에서 '이미 있는 키'를 다루는 정석은
except sqlite3.IntegrityError야. 여기에 track 4의 UPSERT를 얹으면 대부분의 앱은 예외를 잡을 자리 자체가 거의 없어져.