본문 바로가기

Programming/Python Tutorials

[PYTHON 3] Tutorials 26. Exceptions - 예외처리


안녕하세요. 이번 시간에는 파이썬에서 발생할 수 있는 오류를 어떻게 처리하는지에 대한 것을 알아보려고 합니다. 프로그램을 만들다보면 이런 저런 오류로 골머리를 앓는 경우가 빈번한데, 이러한 오류, 에러를 어떻게 잘 핸들링 하느냐도 코딩 실력 향상에 크게 도움이 됩니다. 다행히 파이썬에서는 어떤 오류가 발생하면 여타 언어에 비해 왜, 어디서 오류가 발생하는지가 비교적 상세히 기술이 됩니다. 이렇게 친절히(!) 알려주는 문구들이 무슨 의미인지 알아야 할 것이며, 이를 어떻게 해결하는지 혹은 우회하는지를 살~짝 맛보기 해 보겠습니다. 그럼 시작하겠습니다.



아래와 같이 어떤 숫자를 받아들여서 단순 출력하는 프로그램을 만들어 봤습니다. 그런데 에러가 발생을 했네요. 어떤 오류인지 확인을 해보니 'ValueError' 라고 알려주고 있습니다. 무슨 의미냐하면, 입력값을 받아들여 숫자화(integer)해서 ans 라는 변수에 넣었고 그것을 출력하라고 했는데, 입력값이 숫자가 아닌 문자 이기에 발생한 에러입니다. 즉, '문자를 집어넣고 숫자로 컨버팅하리니 장난쳐~?'라고 성질을 버럭 내는것이죠.

이번에는 루프를 돌려서 여러가지 에러를 발생시켜 보겠습니다. 내부 코드에서 'break' 이 발생하지 않는 한 무한히 반복하라는 'while True'를 넣어주었습니다. 그리고 'try'를 넣어주었는데, 이는 말 그대로 '시도해봐~' or '실행해보시오' 의 의미입니다. 아래 코드를 더 보시면 무슨말인지 체감할 겁니다.

첫번째 그림에서 보인 코딩을 가져다 썼습니다. 그리고 입력받은 숫자를 분모로 하여 출력하라는 프린트를 사용하고 'break'를 사용하여 무한루프에 빠지는 것을 방지하였습니다.

첫 그림에서 발생한 'ValueError' 를 예외처리한 그림입니다. 만약 첫 그림처럼 'ValueError'가 발생하면 아래의 코드인 print("Make sure and enter a number") 를 실행하게 됩니다.

여기까지 잘 실행되는지 프로그램을 돌려봤습니다. 임의의 숫자인 '34'를 넣어보니 결과가 출력되고 프로그램이 종료되었습니다.

이번에는 숫자가 아닌 문자를 넣어보았습니다. 그랬더니 대뜸 'Make sure and enter a number' 라는 문구를 날려주네요. 이는 except ValueError 아래의 값이 실행되어진 결과입니다.

몇 번 더 에러를 발생시켜 보았습니다. 'break'를 만나지 못한 loop 이기에 계속 프로그램이 돌고 있습니다.

그래서 인심 써서 마지막에 숫자를 넣어 주었습니다. 그랬더니 결과를 출력하고 프로그램을 종료 시키는군요.

동일한 코드에서 입력값을 '0'을 넣어 주었습니다. 즉 '23/0' 이라는 결과를 출력해야하는데, 수학적으로 '0'이 분모로 가면 안되겠죠?(극한 개념이 아닌한....) 그래서 'ZeroDivisionError'가 발생했다고 알려주고 있습니다.

그렇다면 이번에는 예외 처리 항목에 이 'ZeroDivisionError'를 핸들링할 수 있게 코딩합니다.

'0'을 넣어도 프로그램이 비정상적으로 종료되지 않고 에러가 났으니, 입력값을 다시 넣어라~ 라고 알려주네요. 그래서 올바른 입력값을 넣어주니 결과를 출력하고 프로그램을 종료하고 있습니다.

그리고 알지 못하는 임의의 에러가 발생하면 그냥 'except' 후에 아래와 같이 'break'를 사용하면 프로그램을 그냥 종료 시킵니다. 그러나 코딩을 할 시에 이와 같은 임의의 에러를 무시하는 처사는 별로 좋지 않습니다. 어떤 에러가 발생하는지를 프로그래머가 알고 있어야 추후에 발생할 또 다른 버그나 오류를 수정할 수 있기 때문입니다. 그러므로 이 방법은 99% 추천하지 않는 경우입니다.

이제까지는 'try' 아래 코드가 실행되는데, 어떤 오류가 발생하면 'except'가 실행되는 것을 보았습니다. 그런데, 'finally' 를 사용하면 위에서 어떠한 경우가 발생하더라도 'finally' 아래 코드는 반드시 실행되게 됩니다. 즉, 오류가 발생하지 않으면 try->finally  만 실행. 오류가 발생하면, try->except->finally 형태로 말이죠.

위의 말이 어려울 경우 아래 실행 결과를 보면 더욱 이해가 되리라 봅니다. 처음에 문자를 넣어서 'except ValueError'가 실행이 되었습니다. 그리고 'finally' 가 실행되어 'Loop complete' 가 출력이 되고 있습니다. 아직 'break'를 만나지 못했으므로 다시 처음부터 루프를 돌게 됩니다. 그래서 입력값을 다시 받게 되는 것이죠. 이번에는 숫자를 제대로 입력하니, 결과를 출력합니다. 그리고 'finally' 아래 코드를 실행하여 'loop complete'를 출력하고 프로그램을 종료합니다.

프로그램을 작성하다 보면 수 많은 에러를 만나게 됩니다. 이를 슬기롭게 잘 해결하면 별 다른 문제가 없겠으나, 대부분의 경우에 이런 저런 에러, 오류로 인해 난관에 봉착하는 경우가 참 많습니다. 그래서 예기치 못한 문제들을 미연에 방지하고자, 어떤 프로그램이 본래의 제 기능을 제대로 구현하는지 확인할 목적으로 이런 저런 에러를 일부러 발생시키고 이를 해결할 수 있는 코딩을 하는 경우가 많습니다. 코딩을 할 분들이라면 에러를 골치거리로만 여기지 마시고 늘상 안고 가야할 존재로 인식하셔야 할 것입니다.