[python] Error Name

Hyeseong·2020년 12월 31일
0

python

목록 보기
16/22

들어가기 앞서 👩

파이썬에서는 발생하는 모든 에러들을 그룹으로 묶어 예외라고 해요.

Error가 발생 하면 예외가 발생하였다고 부르기도 한답니다.

당연한거 왜 굳이 말하냐고요?

추후 예외처리시 아래와 같이 excet문 처리할때 이름이 생각 안나는 경우가 있어요. 그 때를 대비하기 위함이조!

try:
	...
    	...
except NameError:
	return JsonResponse({'Message':'네임 에러 발생!', status=400}
    

그동안 알게 모르게 만난 Error들 무수히 많은데요. 이를 일일히 의미파악하지 않고 그냥 지나친 저는 다시 돌아와서 이렇게 정리한답니다.🙄

Error 유형🕵️‍

1. Name Error🎪

변수가 정의 되지 않았는데 출력하니 NameError가 발생했습니다.
또는 이미 만들어서 사용하다가 del 키워드를 이용해서 삭제한 변수를 사용하려고 해도 NameError가 발생해요.

정의되지 않은 변수 사용🍕

>>> b=20
>>> a=10
>>> c=30
>>> print(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined

del 키워드

>>> a = 1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

2. ZeroDivison Error🎪

분모 값에 0을 두어 나누기를 사용하면 발생하는 오류

>>> a = 1
>>> b = 0
>>> a/b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

3. IndexError🎪

참 많이 봐온 오류네요.
말그대로 범위를 벗어난 오류!

  • 존재 하지 않는 인덱스에 접근하려 할때 발생해요.

주로 sequence형 자료인 문자열, 리스트, 튜플에서 발생해요.

# 인덱싱을 통한 오류
>>> a = 'hello'
>>> a[4]
'o'
>>> a[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

# ---------------------------------------------------------------------
# pop 메서드를 통한 오류
>>> L = ['안녕', '하세요','저는']
>>> L.append('이혜성')
>>> L
['안녕', '하세요', '저는', '이혜성']
>>> L.pop(0)
'안녕'
>>> L
['하세요', '저는', '이혜성']
>>> L.pop(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

4. KeyError🎪

예외 처리를 결심하게 만든 녀석중 하나군요.

집합(Set)과 사전형(dictionary)에서 발생해요.
빈 집합에서 pop(), popitem()를 사용하거나, 집합에 없는 원소를 remove()하면 KeyError가 발생해요.

httpie를 사용해서 POST요청으로 data를 넣던 작업을 하던중 다른 분들이 작성한 예외처리에서 어떻게하면 KeyError를 발생하는건지 하다가 예외처리 정리가 필요하다고 생각이 들게 했던 오류명 중에 하나에요.

email이라는 키를 'email`라고 오타를 내서 요청하니 해당 키를 찾지 못해 나타난 오류에요.

  • 키를 잘못 입력
  • 존재 하지 않는 키를 입력(위와 동일하조?)
❯ http -v POST localhost:8000/account/login password=1111 emai='hyeseong43@gmail.com'
POST /account/login HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 52
Content-Type: application/json
Host: localhost:8000
User-Agent: HTTPie/1.0.3

{
    "emai": "hyeseong43@gmail.com",
    "password": "1111"
}

HTTP/1.1 400 Bad Request
Content-Length: 77
Content-Type: application/json
Date: Wed, 30 Dec 2020 12:32:34 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.5
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "MESSAGE": "키에러가 발생했습니다."

5. 코드 쑤~톼일~ EAFP🎪

파이썬의 철학 The Zen of Python처럼 여기서도 뭔가 철학?이 예외처리에도 적용되는데요.
그 이름은 `EAFP(Easier to Ask for Forgiveness than Permission)'

일단 키가 존재한다고 가정하고 코드를 작성해요. 그 이후 그 생각이 틀리면 예외 처리를 이용해서 문제를 해결하는 코딩 스타일이에요.

그래서 if < try.. except 로 예외처리를 하는거조.
어떤 문법적인 에러든지 문법을 잘못 적은 경우에는 SyntaxError라는 이름으로 에러가 발생하고 코드가 전혀 수행되지 않조? 이는 무조건 고쳐야하는 오류이지만

다른 에러들은 발생하지 않을 것이라는 가정 하에 코드를 작성하고 만약 에러가 발생하면 어떻게 처리해야 한다는 것을 코드에 추가하도록 권장! 하는거에요.

6. AttributeError🎪

  • 모듈의 속성을 잘못 사용
  • 클래스 속성을 잘못 이용

위와 같은 이유로 발생해요.

  1. 모듈에서
>>> import math
>>> math.pii
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'math' has no attribute 'pii'
  1. '클래스`에서
>>> L = [1,2,3]
>>> L.append(7)
>>> L.add(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'add'

7. ValueError🎪

특정 값을 가져올 수 없는 경우에 발생해요.

  • 리스트에 없는 원소 ?에 대하여 remove(?) 또는 index(?) 속성을 사용하면 ValueError`가 발생해요.

remove() 사용시 오류🍕

>>> L=[1,2,3]
>>> L.remove(3)
>>> L
[1, 2]
>>> L.remove(11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>>

index() 사용시 오류🍕

>>> L = [10,20]
>>> L.index(20)
1
>>> L.index(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 1 is not in list
>>>

참고!
tuple 역시 원소의 인덱스를 알수 있기에 index(value)속성을 사용하면 ValueError가 발생해요

tuple() 사용시 오류🍕

>>> T=('안녕','반가워',100)
>>> T.index('안녕')
0
>>> T.index('반가워')
1
>>> T.index(100)
2
>>> T.index(101)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: tuple.index(x): x not in tuple
>>>

8. FileNotFoundError🎪

파일이 없는데 open()메서드를 이용할 때 나타나는 에러에요.

  • 해당 경로 설정문제
  • 파일 이름 오타, 확장자명등 여러가지 요인
>>> f = open('hello.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'

9. TypeError🎪

자료형에 맞는 연산을 수행하지 않는 경우에 TypeError가 발생해요.

Note

  • 수치 자료형인 정수, 실수, 복소수 끼리는 연산 OK
  • 수치 자료형과 Bool 자료형도 함께 연산 OK
  • 시퀀스 자료형(str, list, tuple)은 같은 자료형 끼리만 + 연산 OK
  • 집합 & 딕셔너리에는 + 연산 불가
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글