본문 바로가기
C.W.K.
Stream
Lesson 09 of 10 · published

에러 처리 — sqlite3 Exception 클래스

~10 min · python, errors, exceptions

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

맞는 예외만 잡고, 세상 전부는 잡지 마

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를 얹으면 대부분의 앱은 예외를 잡을 자리 자체가 거의 없어져.

Code

예외 갈래별로 나눠 잡기·python
import sqlite3

try:
    conn.execute('INSERT INTO users(email) VALUES (?)', ('dup@x.com',))
except sqlite3.IntegrityError as e:
    print('duplicate 또는 다른 제약 실패:', e)
except sqlite3.OperationalError as e:
    print('운영 이슈 (locked, disk 등):', e)
except sqlite3.DatabaseError as e:
    print('엔진의 다른 거:', e)

External links

Exercise

예외 클래스를 하나씩 일부러 터뜨려봐. UNIQUE를 어겨서 IntegrityError, 없는 테이블을 열어서 OperationalError, 닫힌 cursor를 써서 ProgrammingError. 각각에 대해 다른 예외는 안 삼키고 그 경우만 처리하는 좁은 except를 붙여. 그리고 어느 것이 유저한테 보여줄 메시지에 어울리고 어느 것이 로그에만 남길 것인지 생각해봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.