파이썬 기초

[파이썬 기초] 7. 오류를 해결해보자

빈이름 2024. 6. 28. 12:54

아무리 날고기는 프로그래머라도 피해갈 수 없는 것이 있습니다. 바로 코딩 오류입니다. 사람인 이상 한번에 완벽한 코드를 짤 수는 없습니다. 코딩은 원래 코드 작성시간보다 코드를 수정하고 에러를 해결하는 시간이 훨씬 깁니다.

 

그런만큼 여러분도 코딩에서 발생하는 오류들과 친해질 필요가 있습니다. 오류를 해결하는 능력도 결국 경험이 가장 중요합니다. 하지만 초보땐 막막할 수 있으니까 조금이라도 가이드를 제시해 보고자 합니다.

1. 오류 찾는 방법

코딩 오류는 보통 어디서 에러가 발생했고 왜 에러가 발생했는지 에러 메세지를 출력해 줍니다. 에러 메세지 하나를 살펴보겠습니다.

빨간 줄로 그은 부분을 보면 "main.py" 파일의 4번째 줄에서 에러가 발생했다는 것을 알 수 있습니다. 그러면 여러분은 오류를 해결하기 위해 "main.py"의 4번째 줄을 확인해 보면 되겠죠?

"main.py"의 4번째 줄에는 a와 b를 더하는 코드가 있습니다. 여기서 문제가 발생했다는 것은 a와 b 둘 중 하나 혹은 둘 다 문제가 있다는 것이겠죠. 그러니 a나 b를 수정해야 한다는 것을 생각할 수 있습니다.

그리고 아래 에러 메세지에서 "TypeError: unsupported operand type(s) for +: 'int' and 'str'" 라고 써있습니다. 즉, a와 b의 type이 문제라는 것을 알 수 있습니다. 그러니 a와 b의 타입을 체크한 뒤 다시 코드를 수정해 보면 됩니다.

 

여러가지 모듈이 얽혀 있는 경우에도 에러가 어디서 발생했는지 다 표시해 줍니다.

"main.py" 에서 "module.py"의 코드를 불러온 뒤 코드를 실행한 화면입니다. 에러메세지를 보면 "main.py"의 5번째 줄에서 에러가 발생했으며, 이는 "module.py"의 13번째 줄, 이어서 "module.py"의 6번째 줄까지 이어서 문제가 되고 있다는 것을 보여줍니다.

그러니 여러분은 에러가 발생한 모듈을 위 메세지를 보고 코드를 이어서 타고타고 들어가면서 어디서 문제가 됐을지 고민해 보면 됩니다.

 

이는 라이브러리를 활용할 때도 마찬가지로 여러분의 코드 어디에서 문제가 발생했고, 이게 라이브러리의 어디 코드와 문제가 되는지를 보여줍니다. 잘 만들어진 라이브러리의 경우 에러 메세지까지 모두 구현해둬 문제를 알기 쉬운 경우도 있지만 그렇지 않은 경우도 많습니다.

위 코드와 에러메세지를 보면 저는 코드를 "main.py"에 4줄 밖에 입력하지 않았는데 에러메세지는 이상한 경로에서 2000번째 줄 코드가 문제가 된다 막 이런 식으로 여러 줄의 메세지를 출력해주는 것을 볼 수 있습니다.

 

저 복잡한 경로의 코드가 라이브러리의 코드들입니다. 보통 라이브러리의 코드를 수정하는 것은 복잡하기도 하고 다른 문제를 발생시키기도 쉽기 때문에 라이브러리의 코드보단 여러분의 코드를 라이브러리에 맞춰주는 것이 좋습니다.

 

즉, 빨간 네모를 치지 않은 부분의 메세지들은 참고만 하고 여러분의 코드를 검증하는 것이 좋다는 뜻입니다.

 

맨 아래줄을 보면 arg0과 arg1의 shape이 맞지 않다고 하는 것을 볼 수 있습니다. 그리고 제 코드를 보면 plt.bar()에서 2개의 인자(arg)를 제공한 것을 알 수 있습니다. 그리고 두 인자의 shape이 각각 (5,)와 (2,)로 에러 메세지와 일치하므로 plt.bar()에 일치하는 shape의 인자를 전달해야 한다는 것을 알 수 있습니다. 이 경우는 라이브러리가 에러 메세지까지 잘 구현해줬기 때문에 쉽게 오류를 알 수 있었습니다.

2. 예외 처리하기

버그를 방지하기 위해 활용할 수 있는 방법 중 하나는 예외처리를 해주는 것입니다. 예외처리는 코드에서 에러가 발생했을 때, 코드를 정지시키지 않고 코드를 진행 시킬 수 있는 방법입니다.

from module import Temperature

temp = Temperature()
C = '35'

try:
    temp.print_temperature(C=C)
except:
    print(f"value {C} is not acceptable.")

예외 처리는 try와 except를 사용해 구현할 수 있습니다. 위와 같이 코드를 작성하면, try: 의 아래에 적혀 있는 코드에서 에러가 발생하면 코드를 종료하지 않고 except: 의 아래에 적혀 있는 코드를 실행하게 됩니다.

 

에러가 발생해도 프로그램이 종료되면 안되는 경우 많이 사용합니다. (보통 웹프로그래밍에서 많이 사용합니다.) 그러나 근본적으로 오류를 해결하는 방법은 아니기 때문에 사람에 따라 호불호가 갈리는 에러 처리 방법입니다.

3. 디버그 모드 활용하기

Visual studio code와 같은 코드 작성 툴을 사용하고 있다면 디버그 모드를 활용하는 것도 좋습니다. Visual Studio Code는 F5를 누르면 디버그 모드를 실행할 수 있습니다.

그리고 위에 뜨는 화면에서 Python Debugger... - Python Debugger: Python File을 선택해 주시면 디버그가 실행됩니다.

 

디버그 모드의 장점은 에러가 발생한 부분에서 코드가 정지되면서 현재 실행되고 있는 코드에 있는 변수, 함수 등을 전부 확인할 수 있다는 겁니다.

보면 에러가 어디서 발생했는지 코드에서 노랗게 표시를 해주며 에러메세지도 그 밑에 출력을 해줍니다.

그리고 에러 해결을 돕기 위해 화면 좌측에 현재 실행되고 있는 파이썬 코드의 변수, 함수, 클래스 등을 모두 보여줍니다. 에러 찾기 훨씬 쉽겠죠?

4. 에러 해결 팁

  • 오타로 인한 오류가 생각보다 많습니다. 꼭 확인해 주세요.
  • 에러 메세지가 너무 어렵다면 구글링이나 chatGPT를 쓰면 좋습니다.
  • 다른 사람의 코드를 참고해서 작성하는데 에러가 발생한다면 그 사람의 코드가 너무 옛날건 아닌지, 본인이 사용하는 코드가 너무 최신 버전은 아닌지 확인해 보세요.

    라이브러리의 경우 계속해서 업데이트가 되기 때문에 너무 옛날 코드를 보면 사용방법이 달라져 에러가 발생할 수 있습니다. 더 최신 버전의 코드를 탐색하거나 해당 라이브러리의 docs를 검색해서 바뀐 기능을 확인해 보는 것이 좋습니다. 꼭 그 옛날 코드를 써야겠다면 그 코드에서 사용한 라이브러리의 버전을 알아내서 해당 버전의 라이브러리로 재설치를 하는 것이 좋습니다.

    원하는 버전의 라이브러리를 설치하는 방법은 아래와 같이 '=='을 사용하면 됩니다.
pip install numpy==1.24.4

 

그 외에도 생각나는 팁이 있으면 계속해서 업데이트 하도록 하겠습니다. 조금이나마 도움이 되길 바라며 에러 해결법은 여기서 마치겠습니다. 감사합니다.