웹 서비스 개발(FB,BE,SERVER,DB)/Python

9. 예외 처리(Exception Handling)

Zoo_10th 2024. 1. 13.

 1. 오류(Error)와 예외(Exception)

- 오류(Error) : 프로그램이 의도하지 않은 동작을 하거나 예기지 않은 상황이 발생하는 것이다.오류는 프로그램의 실행 중에 발생할 수 있으며, 예기치 않은 오류는 프로그램의 종료로 이어질 수도 있다.- 예외(Exception) : 프로그램의 실행 중에 예상 가능한 오류를 의미한다.특정 상황이나 에서 조건에서 발생할 수 있는 오류로, 프로그래머가 미리 예측하고 처리할 수 있도록 설계된 오류이다. 예외가 발생하면 프로그램의 흐름이 중단되지 않고 예외 처리 코드를 통해 적절한 조치를 취할 수 있다.

 

1-1. 파이썬의 예외들

- 0으로 숫자를 나누는 에러(ZeroDivisionError)

숫자를 나누는 경우 0을 분모로 할 수 없다. 만약 0이 분모의 위치에 있다면 ZeroDivisionError이 발생한다.

 - 인덱스를 벗어난 에러(IndexError)

인덱싱이 가능한 자료형에 인덱스 범위를 벗어나는 범위를 지정하게 되면 IndexError이 발생한다.

 - 타입이 맞지 않는 에러(TypeError)

주어진 타입이 맞지 않을 때 발생되는 에러로 잘못된 타입의 자료형이 사용될 경우 TypeError이 발생한다.

 - 해당 파일이 없을때 발생하는 에러(FileNotFoundError)

디렉토리 또는 파일을 불러올 때 해당 경로가 없거나 잘못된 파일명을 사용했을 때 FileNotFoundError이 발생한다.

 - 부적절한 값을 가진 인자를 받아 발생하는 에러(ValueError)

타입에러와 비슷하게 잘못된 인자를 받아 발생하는 에러이며 함수나 클래스등의 인자가 잘못된 값으로 입력될 경우  ValueError가 발생한다.

 - 문법이 맞지 않아 발생하는 에러(SyntaxError)

띄어쓰기가 맞지 않거나 콜론(:)을 빼고 코드를 작성하는 등 문법에 맞지 않은 코드를 실행할 경우 SyntaxError가 발생한다.

 

2. 예외 처리 

프로그램이 예상치 못한 상황에서도 계속 실행되도록 하는데 중요한 역할을 한다. 일반적으로 프로그램은 예외상황에 대응하는 방식으로 설계되지 않은 상황에서 오류가 발생할 수 있다. 이런 오류로 인해 프로그램이 비정상적으로 종료되는 것은 사용자에게 불편을 줄 뿐만 아니라 데이터 손실이나 시스템 문제로 이어질 수도 있다.

예외 처리를 통해 예외 상황에 대비하여 프로그램을 유연하게 만들 수 있다. 예외 처리 구문을 사용하여 예외가 발생하는 부분을 감싸고, 예외가 발생했을 때 실행될 대체 코드나 예외 처리로 로직을 구현할 수 있다.

예외 처리는 프로그램의 안정성과 신뢰성을 높이는 것에 기여한다. 

 

2-1. 예외 처리 방법 - 1(try~except)

 - 기본구조(try~except)

예외 처리를 위해 try 구문에 실행될 코드를 작성하고 except 구문에 예외가 발생했을 때 실행될 코드를 작성하는 방식을 사용한다.

try:
	실행할 코드
except:
	예외 발생시 실행될 코드

 - 예외 지정(try~except 예외명)

예외를 지정하여 해당 예외에 대해서만 동작하도록 할 때 except 다음에 지정할 예외를 작성하면 된다. 이때 지정된 예외가 아니면 에러 메시지를 그대로 출력한다.

try:
	실행할 코드
except 지정할 예외:
	지정된 예외 발생시 실행될 코드

0을 입력하여 의도적으로 예외를 발생하도록 한 코드이다.

 - 예외 지정 후 예외 이름 사용(try~except 예외명 as 별칭)

예외를 지정하고 해당 예외명을 가져와 사용할 때는 , 별명(alias)을 지정하여 사용할 수 있다. except옆에 예외명을 작성하고 뒤에 as를 붙여, 별명을 작성한다.

try:
	실행할 코드
except 예외명 as 별칭:
	지정된 예외 발생시 실행될 코드

 - 예외 여러 개 지정하기(try~except ~ except … )

여러 개의 예외를 지정하는 경우 except를 여러 번 사용하여 구현할 수 있다. try문의 실행문에서 except 중 하나가 발생하면 해당 except 종류에 맞는 구문이 실행된다.

try:
	실행할 코드
except 예외명1 as 별칭1:
	예외1 발생시 실행될 코드
except 예외명2 as 별칭2:
	예외2 발생시 실행될 코드

2-2. 예외 처리 방법 - 2(try ~ except ~ else)

예외가 발생할 때와 발생하지 않을 때 실행되는 코드를 구분하여 작성하는 경우 else를 사용한다. try구문에 실행될 코드를 작성하고 except 구문에 처리할 예외를 작성한 뒤 else 구문에 예외가 발생하지 않았을 때 실행될 코드를 작성하는 방식이다. try구문의 코드가 진행 중 예외를 발생시키면 except 구문이 실행되고 예외가 발생하지 않고 try 구문이 끝나면 else 구문이 진행된다.

try:
	실행할 구문
except:
	예외가 발생할 경우 실행할 구문
else:
	예외가 발생하지 않으면 실행될 구문

2-3. 예외 처리 방법 - 3(try ~ except ~ finally)

예외 발생 여부와 관계없이 항상 실행되어야 하는 코드가 있다. 예를 들어 파일을 불러온 후 close를 실행해야 하는 경우이다. 이러한 경우 예외가 발생하더라도 파일을 닫아야 하기 때문에 finally를 사용하여 예외 발생 여부와 관계없이 실행시키는 코드를 사용할 수 있다.

try:
	실행할 구문
except:
	예외 발생시 실행될 구문
finally:
	예외 발생여부와 상관없이 실행될 구문

 문제

입력값에 5를 더하는 코드를 작성하고 입력값이 숫자가 아닌 경우 발생하는 ValueError를 예외처리하고, 입력값이 숫자인 경우 제곱을 출력하고, 예외발생 여부와 상관없이 실행되는 출력문을 작성하시오.

 

정답

3. 예외 처리 활용 

3-1. 예외 회피하기

예외 회피는 특정 예외가 발생했을 때 아무런 작업을 수행하지 않고 예외를 그대로 넘기는 것을 의미한다. 예외 회피는 pass 문을 사용하여 구현할 수 있습니다. pass 문은 아무런 동작을 하지 않고 그냥 넘어가는 역할을 한다.

예외 회피는 예외가 발생해도 문제가 되지 않는 경우에만 사용해야 한다.

try:
	실행할 구문
except:
	pass

3-2. 예외 발생시키기

개발자가 의도적으로 예외 상황을 만들어내는 것을 의미한다. 파이썬에서는 raise 키워드를 사용하여 예외를 발생시킬 수 있다. raise 키워드 다음에는 발생시킬 예외의 종류를 지정해주어야 한다.

예외를 발생시키는 이유는 특정 조건이 충족되지 않거나 예상치 못한 상황이 발생했을 때, 프로그램의 흐름을 제어하고 예외를 처리하기 위함이다.

 

 - 함수의 재정의가 필요한 경우(NotImplementedError)

파이썬에는 미리 정의해둔 예외가 있다. 그중 NotImplementedError는 반드시 필요한 부분이 구현되어 있지 않을 경우를 나타내주는 예외다. 예를 들어, 내가 함수의 이름만 정의해 두고 내용을 비워두었을 때, 이 부분을 다음의 누군가가 채워 넣거나 나중에 다시 채우기 위해서 이 함수에 raise  NotImplementedError를 해놓을 수 있습니다. 이러한 경우 해당 함수를 호출하면 NotImplementedError가 발생되도록 한다.

파이썬에서 미리 지정한 예외는 Exception클래스에 모여있다.

(Exception.__subclasses__()를 통해 확인할 수 있다.)

 - 직접 예외 만들기 (CustomException)

파이썬에서는 예외를 직접 정의하여 사용할 수 있다. 이를 통해 특정 상황에서 사용자 정의 예외를 발생시킬 수 있다. 사용자 정의 예외를 만들기 위해서는 Exception 클래스를 상속받아 새로운 예외 클래스를 정의한다. 그리고 필요한 추가적인 메서드나 속성을 정의할 수 있다. 예외를 발생시키고자 할 때는 raise 키워드와 함께 해당 예외 클래스의 인스턴스를 생성하여 발생시킨다. 예외 클래스에 메시지를 출력하고 싶다면 __str__ 메서드를 정의하여 해당 메시지를 반환하도록 할 수 있다.

# 1
class 예외명 작성(Exception):
	pass
# 2
class 예외명 작성(Exception):
	def __str__(self):
		return "메시지 입력"
# 3
class 예외명 작성(Exception):
	msg = '메시지 입력'
	def __init__(self):
		super().__init__(self.msg)
	def __str__(self):
		return self.msg
        
# 1,2
raise 위에서 작성한 예외()
# 3
raise 위에서 작성한 예외("메세지입력")

 

문제

다음 요구사항에 맞는 비밀번호 생성기를 만들어 해당 사항에 대한 예외를 만들어 예외처리 하시오. - 비밀번호의 길이는 6~10 개로 모두 숫자로 이루어져있어야 한다. - 입력값이 숫자가 아닐 경우 부적절한 값을 가진 인자를 받아 발생하는 에러(ValueError)로 예외처리 하시오. - 비밀번호는 두번 입력하고 해당 입력 문자의 길이가 다른 경우 예외로 만들고 인덱스를 벗어나는 에러(IndexError)로 예외처리하시오. - 비밀번호 길이가 6개보다 짧을 경우 “TooShort” 이라는 예외를 만들어 예외처리 하시오. - 비밀번호 길이가 10개보다 길 경우 “TooLong”이라는 예외를 만들어 예외처리 하시오.

 

## 1. 비밀번호를 입력 받는다. (=> input 변수로 )
## 2. 입력받은 비밀번호가 숫자인지 검사 ( int <= input을 만든 변수를 넣으면)
## 3. 다시 비밀번호를 입력 받는다. (=> input 변수로 )
## 4. 2 > 문자열의 길이를 비교 (len 비교)
## ---- 예외 만들기 ----
## 1. TooShort이라는 예외 만들기
## 2. TooLong이라는 예외 만들기
## ---- 비밀번호 생성기 ----
## 2-1. 비밀번호의 길이가 짧은지 긴지 확인(len으로 if문)
## 3-1. 비밀번호의 길이가 짧은지 긴지 확인(len으로 if문)
## -------- Except ---------
## 1. ValueError
## 2. IndexError
## ------- CustomError ------
## 2-1 , 3-1 => raise

728x90

'웹 서비스 개발(FB,BE,SERVER,DB) > Python' 카테고리의 다른 글

10. 정규표현식(Regual Expressions)  (0) 2024.01.14
8. 패키지(Packages)  (0) 2024.01.13
7. 모듈(Module)  (2) 2024.01.13
6. 클래스(Class)  (1) 2024.01.10
5. 파이썬 활용  (0) 2024.01.10

댓글