본문 바로가기

PROGRAMMING

[혼공학습단] 혼자 공부하는 파이썬 학습단 5주차 미션

이미지 설명에 '벌써 5주 차라니'라고 써놓고 4주 차 포스팅 보니까 거기도 '벌써 어쩌구' 해놨네...-_-


이번 주 학습 내용은 예외 처리~ 영어로 하면 Exception Handling~

내 영어 이력서에도 있는 에러 핸들링(킹쩔티비)

 

컴퓨터를 사용하다 보면 예상하지 못한 일이 "자주" 발생한다. 어도비 사의 프로그램이나 엑셀로 무거운 파일을 조작하다가 '응답 없음' 상태에 빠진다든지, 우리 어빠들 콘서트 예매하러 서버 시계 켜놓고 광클했는데 페이지를 찾을 수 없다거나 무한 모래시계에 빠진다든지, 드디어 모은 마린 메딕 파이어뱃 3부대를 끌고 적 본진 치러 가려고 했는데 '예기치 못한 오류'로 배틀넷이 꺼진다든지. (요즘은... 한타... 라고 하든가...? 쿨럭)

 

보통 '오류가 났다'거나 '에러가 났다'라고 하는 것들은 사용자 또는 프로그램의 내부 조작이 예기치 못한 방향으로 진행되기 때문에 멈추는 것들이다. 그리고 프로그램이 생각지도 못한 방향으로 지 혼자 막 가다가 자빠지는 것을 프로그래밍 언어에서 '오류'라고 한다. 나는 '오류가 터진다' 거나 '프로그램이 자빠진다' 거나 '실행 되다가 죽는다'라는 워딩을 사용하는데 좀 상스러울 수도 있으나 임팩트를 주기에 이와 같은 표현이 가장 적절하고 생각한다. 대상에 따라서 말을 좀 가려야겠지만.

 


[여기서부터 기본 미션] 프로그래밍에서 말하는 오류란 크게 두 가지, '구문 오류'와 '예외'가 있다. 프로그래밍 언어란 자연어와 다르게 그 언어에서 지정한 구조에 알맞게 써야 실행 가능한 것을 내놓는다. 우리가 평소에 말하는 것처럼 '야 그거 가져와가지구... 아 없어? 아 그럼 딴 거... 응 그래 그걸로 좀 저기 해봐' 같은 (유도리)융통성있는 대응을 바라면 안 된다.

그래서 프로그래밍 언어에서는 일단 실행하기 전에 '이 언어에서 지정한 구조(문법)에 맞게 써져 있는가?'를 검사한다. 여기서 통과하지 못하면 발생하는 오류가 바로 '구문 오류(Syntax Error)'이다. 주로 변수나 함수 이름에 오타가 있거나, 문자열의 따옴표나 함수, 클래스를 열고 닫는 괄호들의 짝이 안 맞을 때, 그리고 제어문(if나 for)의 작성 방식이 틀렸을 때 '저 이 문법 듣도보도 못했는데요? 실행 못합니다' 하고 드러눕는 것이 구문 오류의 예이다.

 

어? 안되잖아? 하는게 또 버그...

 

 

if condition == true:
	print('민이 킹천재)
else
	print('천재 아님')

 

위의 예문만 봐도, else에 콜론이 빠져있고, 첫 번째 print의 문자열에 작은따옴표 쌍이 맞지 않는다. 그렇게 되면 해석 기관(배비지세요?)이 봤을 때 이 문장은 무엇이냐... 하고 생각을 멈추게 되는 것이다. 나는 주로 자바를 사용하기 때문에 구문 오류를 자주 내는 편이다... 어디 내놓을 수 없는 나의 파이썬... 분발하자... 하지만 저 짝 안 맞는 괄호라든지 따옴표는 아무리 failure-tolerant 한 HTML이라도 참을 수 없을걸...?

 

그러나 문법에는 기깔나게 맞아서, 제대로 된 프로그램이 실행되는 경우도 있다. 하지만 이런 실행 중에도 예기치 못한 동작들을 할 수 있는데 그것을 실행 중 오류(Runtime Error) 또는 예외(Exception)이라고 부른다. '코드 상으로는 이렇게 될 생각이었으나~~~ 예외적으로~~~ 이렇게 되었다'라고 생각하면 좋겠다. 예외는 정말 모든 곳에서 발생할 수 있다.

 

 

자료형이 틀렸다.
배열(리스트)의 번지수를 잘못 찾아갔다.
서버가 응답하지 않는다.
페이지를 찾을 수 없다.
정수를 0으로 나눈다.
객체를 참조할 수 없다.
파일이 존재하지 않거나 사용 중이다.
SQL 구문이 글러먹었다.
등등등...

 

아무튼 실행하다가 정상적인 경로로 가지 않으면 예외를 발생하고 일을 안 한다고 보면 된다.

 

이러한 예외가 발생하게 되면 사용자가 큰 불편을 겪을 수 있기 때문에 사전에 발생할 수 있는 예외를 생각하고 대처하는 것이 개발자의 중요한 스킬 중 하나이다(갑분스킬). 혼공자에서도 지금 당장 모든 예외를 알 수 없지만 경험치를 쌓아가면서 알아가야 한다고 쓰여있다. 물론 나도 공부를 대충 하고 때려치웠다면 위에 말한 예외 중에 절반도 알 수 없었을 것이다.

 

사전에 발생할 수 있는 예외에 대처하기 위한 처리는 조건문을 사용하거나 try 구문을 사용하면 된다. 중요한 코드를 실행하기 전에 그 코드에서 필요한 것들을 검증(validation)하는 자리를 마련하는 것이다. 예를 들면 숫자만 필요한 코드를 실행하기 전에, 사용할 값들이 모두 숫자인지, 객체를 사용하기 전에 그 객체가 만들어져 있는지 확인하는 방법이다.

 

 

number = int(input('숫자를 입력하세요'))

if number == 0:
    print('0으로 나눌 수 없습니다')
else: 
    result = 10 / number

print(result)

 

 

위와 같이 입력된 숫자의 값을 확인하여 예외를 발생시킬 수 있는 요소들을 사전에 제거할 수 있다.

 

또는 try 구문을 사용하여 예외가 발생한 후에도 프로그램을 종료시키지 않고 아무 일도 없었던 척(아무 일이 없는 건 아니지만) 할 수도 있다.

 

# 출력 결과 : 꼬부기

list_a = ['피카쥬', '라이츄', '파이리', '꼬부기']
try:
    print(list_a[3])
except:
    print('아마도 잘못된 위치를 참조하려는 것 같습니다')


# 출력 결과 : 아마도 잘못된 위치를 참조하려는 것 같습니다

list_a = ['피카쥬', '라이츄', '파이리', '꼬부기']
try:
    print(list_a[4])
except:
    print('아마도 잘못된 위치를 참조하려는 것 같습니다')

 

프로그래밍에서 발생하는 에러는 크게 두 가지, 구문 오류와 실행 중 오류가 있고, 그 둘의 차이점은 실행하기 전에 틀린 문법 때문에 발생하느냐 아니면 실행한 후에 잘못된 접근으로 인해서 발생하느냐, 이다. 그리고 에러 핸들링이란 에러가 발생하기 전에, 또는 발생하는 순간에 어떻게 할 것인지 작업을 해놓는 것이다. 에러 핸들링을 하기 위해서는 조건문을 사용해서 사전에 에러를 방지하거나 try(와 그 부속인 except, else, finally) 구문을 사용해서 에러가 발생했을 때 원만하게 프로그램을 마무리 지을 수 있게 해야 한다.

 


[추가 미션]

# TypeError : 문자열과 숫자를 +로 결합할 수 없음
output = 10 + '개'

# ValueError : 문자열을 숫자로 변환할 수 없음
int('안녕하세요')

# 구문 오류 : 자~~~ 괄호 짝 보세요~~~~~
cursor.close)

# IndexError : 잘못된 번지수 참조
[1, 2, 3, 4, 5][10]

 

위 코드를 VS나 파이참 같은 에디터로 확인해보면, 구문 오류 같은 경우에는 빨간 줄이 그어지면서 '여기 틀리셨습니다!' 하고 알려주지만, 실행 중에 알 수 있는 1, 2, 4번의 오류는 문법이 틀린 것은 아니기 때문에 에디터가 알려주지 않는다. 그래도 구문 오류 정도만 알 수 있어도 감지덕지이므로 우리 모두 에디터 사용하자. 뭐 메모장 근성 코딩도 말리지는 않는다.

 


 

여기까지 해서 파이썬의 예외에 대한 내용을 알아보았다. 자바와는 다른 문법인 else도 특이했고, 예외 객체를 사용할 때 as라는 키워드를 사용하는 것도 기억에 남는다. 안정적인 프로그램을 구현하기 위해서는 예외 처리가 몹시 중요하다. 실행했는데 빨간 글씨 좌좌좍 우리가좍!!! 하면서 멈췄다고 쫄지 말고 뭐라고 하는지 처음부터 한 줄씩 읽어보자. 그러면 어디서 어떤 예외가 발생했고, 힌트까지 알려주기 때문이다. 진짜 모르겠다? 그러면 예외 발생한 첫 줄에 있는 예외 이름 복사해서 네이버나 구글에 물어보자. 웬만한 예외는 이미 슨배 개발자님들께서 모두 발생시켜서 해결했으니까.

 

그럼

즐코

 


나 또 우수 혼공족 됨. 하... 쥔촤... 친구들한테 자랑하면 '너 또 코딩 공부하냐?'라고 하고, 학생들에게 자랑하기는 좀 그러니까 또 여기다가만 소리쳐놓겠다

우수혼공족 됐다고~~~ 소리쳐어어어~~~~

코딩 세상에서 제일 재밌어 진짜ㅠ 짱딩

 

* 배비지를 막스 베버와 헷갈려서 수정했습니...다

** 피카쥬 머냐?; 귀찮아서 수정은 안해야지