1. Exception(예외) and Error(에러)의 차이점
Exception(예외)
와Error(에러)
에 대해 설명하겠다.- 예외는 무엇이고 에러는 무엇이다라고 외우진 말자.
- 예외를 에러의 범주에 포함하기도 하기 때문이다. 다만, 예외와 에러에 대한 틀을 잡기 위해 설명한다.
Exception(예외)
는 우리가 작성한 로직에서 비정상적으로 발생한 사건(event)이다.- 예외에는 ‘예측이 가능한 예외’와 ‘예측이 불가능한 예외’로 나눠진다.
- ‘예측 가능한 예외’의 경우는
id 입력
을 생각해보자. 영어로 입력해야하는데, 한글을 입력했을 경우 예외가 발생한다. - ‘예측 불가능한 예외’의 경우는
메모리의 용량
이 부족해서, ‘OS’에서 발생한 에러, 하드웨어적인 에러 등등이 해당된다.
- 이 예외와 에러를 잘 처리해야 내가 의도한대로 작동하는 어플리케이션을 만들 수 있다.
2. Error의 종류
2.1 SyntaxError: 문법 오류
|
|
2.2 TypeError: 자료형에 맞지 않는 연산을 수행하여 발생하는 오류
|
|
2.3 NameError: 참조가 없을 때 발생하는 오류
|
|
2.4 IndexError: index가 존재하지 않아 발생하는 오류
|
|
2.5 ValueError: 참조값이 없을 때 발생하는 오류
|
|
2.6 KeyError: 해당되는 key가 없을 때 발생하는 오류
|
|
2.7 AttributeError: 모듈, 클래스에 있는 잘못된 속성을 사용하여 발생한 오류
|
|
2.8 FileNotFoundError: 파일을 찾을 수 없을 때 발생하는 오류
|
|
2.9 ZeroDivisionError: 0으로 나눠서 발생하는 오류
|
|
3. 예외 처리 (try ~ exception)
try
:에러가 발생할 가능성이 있는 코드
실행- 이 에러는 내 코드가 정확해도, 방문한 사이트 서버나 여러 프로그램이 외부와 연결될 때, 문제가 있을 수 있기 때문이다. 그래서 외부적으로 문제가 발생해도
try ~ except
로 대비한다.
- 이 에러는 내 코드가 정확해도, 방문한 사이트 서버나 여러 프로그램이 외부와 연결될 때, 문제가 있을 수 있기 때문이다. 그래서 외부적으로 문제가 발생해도
except 에러명 1~n
:- error가 발생했을 때 잡아내어 다음 코드로 넘어가도록 해준다.
- 여러 개 가능하다.
- 어떤 Error만 잡을지 정할 수 있다.
- 모든 error 잡아내기
except Exception:
은 모든 예외의 부모격이라 모든 error를 잡아낸다.except:
또한, 모든 error을 잡아낸다.- 하지만, 정확히 어떤 error가 발생했는지 알 수 없다.
- 정확히 어떤 error가 발생했는지 알아야 로그를 남길 때 정확히 남길 수 있다.
- 예제 3에서처럼 예제 2에서
alias
를 줘서except Exception as e
와print(e)
을 사용하여, 대략적인 error 내용을 확인하여 출력하도록 할 수 있다.
else
:try block
에에러
가없을 경우
실행한다.- 정상적으로 흘러갈 때 실행된다.
for ~ else
에서도for
문에break
를 만나지 않으면else
가 실행했듯이,except
를 만나지 않으면 실행된다.
finally
: 에러발생 유무와 상관없이무조건
실행된다.- error 발생 유무에 상관없이 항상 실행해줘야 하는 구문으로
finally
를 사용한다. - 예를 들어 error가 발생했을 경우, 연결된 메모리를 끊어줘야 메모리가 새지 않기 때문에
finally
를 통해서 실행한다.
- error 발생 유무에 상관없이 항상 실행해줘야 하는 구문으로
|
|
- error 를 일부러 발생시킨 경우를 생각해보자. 언제 일부러 error 를 발생시킬까??
- 여기서 error 란 Python에서 발생시킨 게 아니라, 설계자가 회사에서 요구하는 논리상 알기 위해서 일부러 발생시킨 error를 말한다.
- 아래 코드로 설명을 하자면 a가 ‘Kim’이 아니라면 이는 파이썬 내에
ValueError
가 발생된 것이 아니다. 하지만 회사에서 ‘Kim’이 아닌 경우에 대해 알기 위해서 error를 발생시켰다. 이를 토대로 언제 ‘Kim’이 아닌지 역으로 분석할 수 있다.
|
|
- a에는 ‘Park’가 할당되었다. ‘Kim’이 아니기 때문에, 일부러
ValueError
를 발생시켰다. 그래서except ValueError
문이 실행이 되어 print문이 출력되었다. - 일부러 Error를 일으키고, ErrorType도 정할 수 있다는 걸 알고 있자.