티스토리 뷰
예외처리 - 기본 흐름
프로그래밍을 하다보면 필연적으로 수많은 오류들에 직면하게 됩니다. 오류가 발생하는 것이 보다 완성도 높은 프로그램을 만드는데 필요하긴 합니다만 상황에 따라 오류를 무시해야 할 경우도 있고, 오류에 따라 적절한 조치를 취하고 싶을 경우들이 있습니다. 이런 경우들을 해결하기 위해 파이썬은 예외 처리 기능을 지원합니다.
파이썬의 예외 처리는 4가지로 이루어져 있습니다. try, except, else, finally 로 총 4가지 입니다만, 예외 처리시 이 4가지를 모두 사용할 필요는 없습니다.
예외처리 - try | except
가장 기본적으로 사용되는 절은 try 절과 except 절 입니다. try 안에는 기본적으로 실행하는 코드를 넣고 except 절에는 에러가 발생했을 경우 시행할 코드를 작성합니다.
첫 번째 사용방법은 try, except 만 사용하는 방법입니다.
try:print(5/0)except:print('wrong division')
결과는 wrong division 이라는 문자열이 출력됩니다. try, except 만 사용한다면 어떠한 종류의 에러가 발생하더라도 except 절의 코드가 실행됩니다.
두 번째 사용방법은 발생 오류를 except 절에 작성하는 방법입니다.
try:print(5/0)except ZeroDivisionError:print('wrong division')
ZeroDivisionError 이라는 오류를 명시해주었습니다. 이 경우 다른 에러가 발생하면 except 절에서 처리하지 않습니다.
세 번째 방법은 발생 오류와 오류메시지 변수까지 except 절에 작성하는 방법입니다.
try:print(5/0)except ZeroDivisionError as e:print(e)
이 코드는 'division by zero' 라는 메시지를 출력합니다. ZeroDivisionError 에러에 저장되어있는 string 을 출력하게 됩니다.
예외처리 - try | except | else
예외처리의 기본인 try 절과 except 절에 else 절을 추가해서 에외처리문을 구성할 수 있습니다. else 절은 예외가 발생하지 않아 except 절을 실행하지 않았을 경우 실행되는 절 입니다.
try:print(5/1)except:print('error')else:print('no error')
이 코드는 5.0 과 'no error' 를 출력합니다. try 절에서 문제가 없었기 때문에 except 절이 실행되지 않고 else 절이 실행되는 것을 볼 수 있습니다.
예외처리 - try | except | finally
finally 절은 try 절에서 예외의 발생여부에 관계없이 항상 실행되는 절 입니다.
try:print(5/0)except:print('error')finally:print('end')
이 코드는 'error' 과 'end' 문자열을 출력합니다. 에러가 나더라도 finally 절은 실행되는 것을 알 수 있습니다.
예외처리 - 여러개의 에러 처리하기
코드에서 예외는 보통 한 가지만 나타나지 않습니다. 어떤 예외가 나와도 동일하게 처리할 수도 있지만, 다른 예외가 발생하면 다르게 처리하는 것이 좋은 예외처리 방법입니다.
try:print(5/0)print(c)except NameError as e:print(e)except ZeroDivisionError as e:print(e)
위의 코드는 변수가 설정되지 않았을 경우 발생하는 에러인 NameError 과 분모가 0 일 경우 발생하는 ZeroDivisionError 에러를 예외처리 해준 코드 입니다.
이 코드를 실행시키면 'division by zero' 라는 문자열이 출력됩니다. 5/0 에서 ZeroDivisionError 가 NameError 보다 먼저 발생하기 때문입니다.
예외처리 - 오류 회피하기
예외처리를 하다보면 오류를 자유자재로 다뤄야 합니다. 어떤 경우에는 에러를 무시하기도 하고 어떤 경우에는 프로그램의 목적에 맞게 에러를 일부러 발생시키기도 하고, 어떤 경우에는 새로운 에러를 만들어 프로그램에 적용해야 하는 경우도 있습니다.
먼저 오류를 회피하는 방법을 살펴보겠습니다.
try:print(5/0)print(c)except NameError as e:print(e)except ZeroDivisionError as e:pass
이 경우에는 어떤 상황이 발생할까요. 결과를 먼저 말하자면 어떤 것도 출력되지 않습니다. 5/0 에서 ZeroDivisionError 가 발생하면 그냥 아무작업도 하지 않고 다음으로 넘겨버립니다.
예외처리 - 오류 발생시키기
프로그램에서 입력을 받는 경우에 목적에 맞게 입력을 받아야 할 경우가 있습니다. 예를 들어 나이를 입력받는다면 0보다 작으면 안되는 것 처럼 문법상에는 오류가 없지만 오류가 필요한 경우 오류를 일부러 발생시킬 수 있습니다.
try:age = int(input())if age < 0:raise NotImplementedErrorprint(age)except NotImplementedError:print('NotImplementedError')
age 를 입력받은 뒤 값 검사를 하는데 0 보다 작은 값일 경우 NotImplementedError 를 발생시킵니다. ( NotImplementedError 는 아직 작성되지 않은 에러를 의미합니다. )
age 에 -1 을 입력하면 NotImplementedError 가 출력되고 10 처럼 0 보다 큰 수를 입력하면 10 이 출력되는 코드입니다.
예외처리 - 사용자 정의 오류
예외를 원하는 경우에 발생시키는 것이 가능하다면 당연히 예외를 원하는 대로 작성하는 것도 가능합니다. 사용자 정의 오류는 파이썬의 Exception 클래스를 상속해서 만들 수 있습니다.
class AgeError(Exception):def __init__(self, msg='init_error_msg'):self.msg = msgdef __str__(self):return self.msgage = int(input())if age < 0:raise AgeError('r_error_msg')print(age)
AgeError 사용자 정의 오류를 만든 코드 입니다. __init__ 함수는 에러 클래스가 생성될 때 실행되는 함수로 msg 의 내용을 지정합니다. 만약 에러 발생할 때 에러메시지를 지정해주지 않는다면 'init_error_msg' 라고 지정됩니다. __str__ 함수는 에러발생했을 때 출력해주는 메시지를 리턴해주는 함수 입니다. 초기화 할때 'init_error_msg' 로 초기화 하기 때문에 에러 발생 시 다른 문자열을 정해주지 않는다면 'init_error_msg' 문자열이 출력됩니다.
이 코드의 경우 AgeError('r_error_msg') 로 에러 발생 시 'r_error_msg' 문자열을 전달해 주었습니다. 따라서 AgeError 가 발생할 경우에는 'init_error_msg' 가 아닌 'r_error_msg' 가 출력될 것입니다.
부족한 블로그에 방문해 주셔서 감사합니다.
잘못된 부분이나 질문이 있으시면
댓글로 말씀해주세요.
금방 확인하고 피드백 드리겠습니다.
좋은 하루 되세요. ^^
'Python' 카테고리의 다른 글
[Python] 언더바 (_) 사용하기 (1) | 2017.12.31 |
---|---|
[Python] 이름없는 함수 - lambda, map, filter (0) | 2017.12.30 |
[Python] 폴더와 그 내부 파일들까지 백업하기 (작성중) (0) | 2017.12.28 |
[Python] dict 정렬하기 (1) | 2017.12.28 |
[Python] for loop 에 2개 인덱스 사용하기 - zip 메소드 (1) | 2017.12.27 |
- Total
- Today
- Yesterday
- 영월여행
- 가족여행
- 영월캠핑
- 가평캠핑
- 캠핑장추천
- 여름캠핑
- 자연힐링
- 캠핑초보
- 가평여행
- Koreancuisine
- 가족캠핑
- 계곡캠핑
- 머신러닝
- Oracle
- 카카오
- 여름휴가추천
- python
- 커플여행
- 알고리즘
- 강원도여행
- 글램핑
- 반려견캠핑
- 백준
- 서울근교캠핑
- sql
- 여름휴가
- SeoulTravel
- bukhansannationalpark
- 강원도캠핑
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |