(Python)에러...

실험하는 코더·2024년 3월 19일

python 입문

목록 보기
4/7

이 글을 작성하려고 한건 노베이스로 시작하면서 4일 정도였는데
제 solved 스트릭이 63일인 것으로 보아 대략 60일 전...

그 때, 마주한 것은 바로 에러였습니다. 그것도 컴파일 에러...
아무것도 몰랐던 저는 컴파일 에러가 왜 나는지도 몰랐는데 지금 생각해보면 그냥 코드를 못짜서였겠죠ㅎ

그럼 오늘은 특별한 주제인만큼 정의와 예외 처리하는 방법만 다루어 보겠습니다.

우선 에러보다 버그에 대해서 알아봅시다.

정의

버그란?

소프트웨어에서 발생하는 오류 or 결함 입니다.
이름의 유래는 영어를 해석하면 알수 있듯이 '벌레'입니다.
벌레같은 녀석이라서 그렇다기보다 실제로 처음 발견된 버그가 벌레가 컴퓨터 회로 합선을 발생시켜서 그때부터 버그라고 부르게 됐다네요

그래서 저희는 이 버그 때문에 발생하는게 에러입니다.

에러란?

프로그램 실행 중에 발생하는 예외상황을 뜻합니다.

파이썬에서는 에러가 크게 두 종류인데요.
Syntax Error와 Exception입니다.

Syntax Error란?

프로그램의 구문이 올바르지 않은 경우 발생하는 에러를 뜻합니다.
보통 오타를 작성하거나 괄호 및 콜론을 빼먹으면서 문법오류가 발생하면 대부분이 Invalid Syntax Error가 나오게 됩니다.
예를 들어, if 절에서 if i=1:이런식으로 비교조건인데 등호를 하나쓰는 경우 나오게되죠.
이것이 컴파일되면서 컴파일 에러를 발생시키기 때문에 컴파일 에러가 발생하면 일단 문법을 틀리게 적은 곳이 없는지 확인을 하시길 바랍니다.
다른 Syntax Error로는 assign to literal(잘못된 할당), EOL(End Of Line), EOF(End Of File)이 있습니다.

Exception이란?

프로그램 실쟁 중에 감지되는 에러입니다.
문법에러가 없다면 컴파일이 되면서 실행이 가능한데 이제 실행하고 나서 발생하는 에러인데,

예외에는 내장 예외(Built-in Exception)이 있습니다.

내장예외란?

파이썬에서 이미 정의되어, 특정 예외상황에 대한 처리를 위해 사용하는 에러입니다.

  1. ZeroDivisionError: 나누는 값이 0일 경우에 발생합니다.
  2. NameError : 지역 또는 전역 이름을 찾을 수 없을 때 발생합니다.
  3. TypeError : 타입이 불일치하거나, 내장함수내 인자 누락,인자 초과,인자 타입 불일치할 경우 발생합니다.
  4. ValueError : 연산이나 함수에 문제가 없지만 부적절한 값을 가진 인자로 받을 경우 발생합니다. 예를 들어 int('a')는 문자열을 정수로 형변환을 하는것이 불가능하여 에러를 발생하죠?
  5. IndexError : 시퀀스 인덱스가 범위를 벗어날 때 발생합니다.
  6. KeyError : 딕셔너리에 해당 키가 존재하지 않는 경우 발생합니다.
  7. ModuleNotFoundError : 모듈을 찾을 수 없을 때 발생합니다.
  8. ImportError : import하려는 이름을 찾을 수 없을 때 발생합니다.
  9. KeyboardInterrupt : 사용자가 control-c를 눌러 발생시킵니다.(루프 강제 종료)
  10. IndentationError : 잘못된 들여쓰기와 관련된 문법오류로 발생합니다.
  11. RecursionError : 재귀 깊이를 초과할 경우에 발생합니다.

대표적으로 위의 11가지 에러가 있습니다.

예외 처리 방법

예외처리 방법은 의외로 간단합니다
바로 try와 except 구문을 사용하는 것인데요

try:
	# 예외가 발생할 수 있는 코드
except 예외명(빈칸도 가능):
	# 예외처리 코드

위의 구조로 작성해주면 됩니다.

예를 들어

while True:
	try:
    	n=input()
	except EOFError:
		print("끝")
        break
    except:
    	print('여긴 도달하지 못할듯?')
 '''
 이 구조하면 input값이 있는 동안 줄을 계속 불러들이다가 input이 없으면 EOFError가 발생하게 되고 이 때 except절로 넘어가게 됩니다.
이 때 except 절에 아무것도 안적으면 모든 에러에 대해서 처리할수 있고,
위처럼 다중으로 예외처리가 가능합니다.
 '''

https://www.acmicpc.net/problem/10951를 보시면 EOFError를 처리하는 방법을 연습하실 수 있습니다.

예외 처리시 주의사항

중요합니다.
예외처리도 하위 조건들을 먼저 처리될 수 있도록 먼저 적어주어야합니다.
if 절과 똑같이 생각하시면 됩니다.
예를 들어

try:
	n= int(input())
    print(10/num)
except BaseException:
	print('얘가 제일 큰 범주에요')
except ZeroDivisionError:
	print('0으론 못나눠요')

위의 코드에서는 절대 ZeroDivisionError의 예외처리에 도달할 수 없습니다.
왜냐면 에러의 구조상 BaseException은 except와 keyboardinterrupt를 합친 예외여서 가장 큰 범주에 속합니다. 만약에 두개의 에러를 따로 관리하고 싶다면 순서상 ZeroDivisionError가 먼저 와야합니다.

마무리

오늘도 간단하게 정리를 하자면,
1. 에러는 정말정말 다양한 종류의 에러가 있습니다. 하지만 문법적으로 잘 적어야 실행이라도 가능하다는 점! 초기에 꼭 문법실수를 줄일 수 있도록 노력해야 됩니다.
2. 일단 실행이 되고 에러가 발생한다면 물론, 코드를 고쳐야하지만 EOFError와 같이 특별한 경우라면? try-except를 통해 예외처리가 가능합니다.
3. 예외처리시 if 조건문을 사용하는 것처럼 먼저 예외 처리를 할 문장을 먼저 적고 점점 큰 범주로 적어줘야 원하는 모든 예외처리가 가능합니다.

개발자가 되기 위해 할게 너무 많아 블로그를 작성할 시간도 부족하네요...
개발자 준비하시는 모든 분들 그리고 개발자 분들 모두 화이팅입니다.
오늘은 그럼 이만~

profile
노베이스의 기록

0개의 댓글