클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

애러 읽고 대처하기 1 - 애러 메시지 읽기 및 자주 접하는 애러코드 3가지 본문

웹 · 앱 개발/디버깅

애러 읽고 대처하기 1 - 애러 메시지 읽기 및 자주 접하는 애러코드 3가지

huenuri 2024. 7. 30. 10:43

이제 애러 코드 메시지를 읽고 자주 접하는 애러코드를 분석하는 시간을 갖고자 한다. 이 수업은 이론 수업이 더 많은 것 같다. 설명을 들으며 이해되는 부분이 많으니 이것도 좋은 방식이다.

그럼 바로 이어서 2주차 학습을 시작해보기로 하자. 가능하면 2시간 안에 2주차 수업을 마치고 다음 과목을 진행해보고 싶다.


 

이론 1 - 애러 메시지 읽기

 

 

 

 

 

OT 수업에서 만났던 애러 메시지이다. 이제 이 메시지를 해석해보기로 하자.

 

 

 

오류 메시지 1

첫 줄 읽기

Traceback... : 가장 최근에 부른 것이 가장 마지막에 온다. 만약 A, B, C 순으로 되어 있다면, C가 가장 아래쪽에 있으니 C에서 올라오면서 읽으라는 뜻이다.

 

두번째 줄 읽기

File... : main.py라는 파일에서 오류가 발생했다. 모듈이라는 함수는 가장 외부에 존재하는 함수이다. 즉, 모듈은 어떤 함수에도 속하지 않고 가장 외부에서 실행된 코드이다.

greeting은 어떤 함수에도 속하지 않고 외부에 존재하기 때문에 이런 메시지가 뜬다. 이 코드를 부르는 시점부터 애러가 시작된 것이다.

 

세번째 줄 읽기

File... 2번째줄 greeting이라는 함수에서 오류가 발생했다. 그 다음줄 print에서 오류가 발생했다. 이후에는 이러한 줄이 더이상 없다는 걸 보니 여기가 결정적인 오류임을 알 수 있다.
두번째 줄은 애러가 발생되는 시작점이다.

 

네번째 줄 읽기

NameError : .. yourname이라는 변수가 정의되지 않았다. 처음의 값은 your_name이었으나 yourname은 본적 없는 변수이다. 이름을 찾을 수 없다는 뜻이다.

 

 

 

오류 메시지 2

이 코드는 평균을 구하는 코드이다. average에 빈 리스트를 넣으니 애러가 떴다.

 

 

 

 

애러 메시지 읽기

 

코드는 average[]에서 오류가 시작되었는데, 진짜 오류는 return에서 발생했다. 그리고 마지막 줄은 애러에 대한 설명이다.
2번째 줄에서 발생했는데, 그 이유는 0으로 나누었다는 것이다. sum은 모든 숫자들의 합이고, len은 리스트의 길이이다. len(numbers)의 값이 0이 되지만, 분모에는 0이 들어갈 수 없게 되어 있다.

프로그램이 복잡하다면 애러 메시지는 길어진다. 아무리 길어져도 밑에서부터 차근차근 읽어가면 이 코드가 왜 애러가 났는지 찾아낼 수 있다.


 

이론 2 - 자주 접하는 애러 코드 1 : Syntax error

초보자들이 가장 만나는 애러코드인데, 잘못된 문법이라는 뜻이다. 잠시 영상을 중단하고 애러 메시지를 찾아보았다.
for문에서 numbers라는 매개변수를 받는 부분이 아닌 add_all이라고 써야 할 것 같다. 왜냐하면 add_all 함수이니 for numbers in add_all이 되어야 하지 않을까?

 

 

 

 

내 답은 틀린 거였다. 오류의 원인은 콜론이 빠진 거였다.
이론 1에서처럼 Traceback이 없는 이유는 논리 자체를 찾을 수 없기 때문이다. 문법 자체가 틀려서 컴퓨터가 이해하지 못했다.

Syntax 애러는 작은 오타가 많고 대부분 스스로 해결할 수 있는 오류들이 많다.


 

이론 3 - 자주 접하는 애러 코드 1 : Name error

 

이 애러도 오타 때문에 발생하는 오류라고 한다. 틀리더라도 한번 찾아보기로 했다. return이 for문 안쪽에 있어야 할 것 같다. 그래야 for문이 실행되고 다시 이 구문으로 돌아갈 테니까. 이 부분은 강사님이 오타임을 인지하시지 못한 것 같았다. 어쨌든 number의 철자가 numbre로 잘못된 부분이 있다.

 

 

 

 

이렇게 정의된 오타를 찾는다면 금방 오류를 제거할 수 있다. 코드가 길어질 때는 이러한 애러를 찾기가 쉽지 않다. 그럴 때 오류 메시지를 읽으며 찾아볼 수 있다.


 

이론 4 - 자주 접하는 애러 코드 1 : Type error

예시 1

 

result는 0으로 초기화된다. 매개변수로 주어진 numbers 리스트가 있는데, 이 리스트의 각각의 원소들을 number에 넣는다. 그러니까 number는 더 큰 집합이고, numbers가 각각의 원소였던 것이다.
1, 2, 3이 들어간다면 결과는 6이 된다. 하지만 문자열 리스트가 들어가므로 타입 애러가 발생했다.

 

 

int와 str은 다음과 같은 연산자로 계산할 수 없다는 것인데 그 이유는 무엇일까? result의 값은 처음에 0이었다. 근데 0과 a를 더할 수 없다.
Type error가 발생했을 때는 두 가지 타입의 차이를 고쳐주어야 한다.

 

 

 

 

환율은 변환해주는 함수이다. 어떤 값이 price로 주어졌을 때 이 달러가 몇 원이냐고 물어보는 것이다. 2달러가 들어갔다면 2200원이 리턴된다. 4.99 달러가 무엇인지 알아보기 위해 이 함수를 실행했지만 이러한 애러가 발생했다.

 

 

 

float와 str을 더할 수 없다.

 

 

만약 고쳐주고 싶다면 숫자를 문자열로 변환한 후에 이것을 더해서 리턴해주면 된다. 파이썬에서는 문자열이 str임에 주의하자. 자바와 헤깔렸다.

 

파이썬에서는 또 다른 편리한 메서드를 지원한다. 숫자를 문자로 변환할 때 f-string이라는 함수를 쓸 수 있다. f"하고 { }"로 감싼 부분에 변수가 들어간다. 이 함수를 사용하면 문자열 안에 직접 넣는 것처럼 사용할 수 있다.


 

실습 1 - 성적 처리 1


이러한 애러 메시지가 뜨는 것을 볼 수 있다.
sum_scores에 0으로 초기화시킨다. 점이라는 글자를 제거하고 그 값을 point에 저장한다. sum_scores에 point의 값을 더하고, 전체 길이를 sum_scores에 나눈다.

 

첫번째 오류 : Syntax

이제 오류 메시지는 뜨지 않지만 아무것도 출력이 되지 않는다. 출력되는 게 없기 때문이다.

 

 

 

두번째 오류 : type

 

출력문을 작성할 때 주의사항은 average를 def 함수 바깥쪽에 적어야 한다는 것이다. 안쪽에 적으면 아무것도 출력되지 않는다.

이 오류는 int와 str 타입이 서로 적용되지 않기 때문에 발생하는 문제이다. score는 정수형이고, point는 점이라는 글자를 제거한 문자이다. 따라서 바꾸려면 형 변환을 해야 한다.

 

 

 

세번째 오류 : name

 

이번에는 다른 애러가 발생했다. 이름을 잘못 적은 것이다.

 

 

 

네번째 애러 : type

 

10번째 줄에서 float와 str을 더할 수 없다는 오류가 뜬다.

 

 

 


 

첫번째 단원 학습을 마치고

이 실습 문제는 정말 어려워서 혼자서는 결코 풀 수 없는 문제였다. 강의 영상을 보면서 함께 따라해보았다. 다음에는 혼자서도 풀어볼 생각이다.

실습 문제를 풀다가 너무 피곤하고 졸려서 10분만 낮잠을 잔다는 것이 2시간이나 잠을 자버렸다. 아마도 평일에 부족한 잠을 주말에 보충하는 것 같다. 난 원래 잠이 진짜 많아서 하루에 10시간 넘게 자는 사람인데, 잠을 줄이는 것이 내 인생 최대의 난관이다.
내일부터는 수면 시간을 4시간 반에서 5시간으로 조금 늘려볼까 한다. 너무 적은 잠은 이후에 나른함과 게으른 일상을 불러오는 것 같다. 이런 시간이 몇 번 반복이 되면 나는 원래 안되는 놈인가봐 하면서 자포자기 할 수도 있기 때문이다.

이제 다음 단원 학습을 진행해볼 것이다!