38. 예외 처리

Joy·2020년 4월 2일
0

예외 exception

코드를 실행하는 중에 발생한 에러
예외처리: 예외 처리는 에러가 발생하더라도 스크립트의 실행을 중단하지 않고 계속 실행하고자 할 때 사용

try except

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드

예) 숫자를 0으로 나눴을 때 발상하는 예외 처리

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
    print(y)
except:    # 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.')

결과: 나눌 숫자를 입력하세요: 0 (입력)
예외가 발생했습니다.

숫자를 0으로 나누면 ZeroDivisionError 예외가 발생
여기서는 except에서 예외 처리를 하도록 만들었으므로 '예외가 발생했습니다.'가 출력
특히 예외가 발생하면 해당 줄에서 코드 실행을 중단하고 바로 except로 가서 코드를 실행

특정예외처리

except에 예외 이름을 지정해서 특정 예외가 발생했을 때만 처리 코드

try:
    실행할 코드
except 예외이름:
    예외가 발생했을 때 처리하는 코드

예시

try:
    index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
    print(y[index] / x)
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
except IndexError:           # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행됨
    print('잘못된 인덱스입니다.')

예외 메시지 받아오기

try:
    실행할 코드
except 예외 as 변수:
    예외가 발생했을 때 처리하는 코
y = [10, 20, 30]
 
try:
    index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
    print(y[index] / x)
except ZeroDivisionError as e:                    # as 뒤에 변수를 지정하면 에러를 받아옴
    print('숫자를 0으로 나눌 수 없습니다.', e)    # e에 저장된 에러 메시지 출력
except IndexError as e:
    print('잘못된 인덱스입니다.', e)

결과: 인덱스와 나눌 숫자를 입력하세요: 2 0 (입력)
숫자를 0으로 나눌 수 없습니다. division by zero

else

예외가 발생하지 않았을 때 코드를 실행

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드

예)

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)

finally

예외 발생 여부와 상관없이 항상 코드를 실행

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드

예외 발생시키기

  • raise 예외('에러메시지')

예)

try:
    x = int(input('3의 배수를 입력하세요: '))
    if x % 3 != 0:                                 # x가 3의 배수가 아니면
        raise Exception('3의 배수가 아닙니다.')    # 예외를 발생시킴
    print(x)
except Exception as e:                             # 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.', e)

현재예외 다시발생

try except에서 처리한 예외를 다시 발생: except 안에서 raise를 사용

예외 만들기

Exception을 상속받아서 새로운 클래스 만들고 init 메서드에서 기반 클래스의 init 메서드를 호출하면서 에러 메시지를 넣어주기

class 예외이름(Exception):
    def __init__(self):
        super().__init__('에러메시지')

문제: 회문이 아니면 예외 발생시키기

표준 입력으로 문자열이 입력됩니다. 다음 소스 코드를 완성하여 입력된 문자열이 회문이면 문자열을 그대로 출력하고, 회문이 아니면 '회문이 아닙니다.'를 출력하도록 만드세요. palindrome 함수와 NotPalindromeError 예외를 작성해야 합니다.

답:

class NotPalindromeError(Exception):
    def __init__(self):
        super().__init__('회문이 아닙니다.')
        
def palindrome(word):
    if word == word[::-1]:
        print(word)
    else:
        raise NotPalindromeError
        
try:
    word = input()
    palindrome(word)
except NotPalindromeError as e:
    print(e)

풀이:

예외 만들고 함수 p를 만들고 이 안에서 raise로 예외 발생해야함

  1. 예외 만들기
    class NotPalindromeError(Exception):
    def init(self):
    super().init('회문이 아닙니다.')

  2. 함수만들기

회문 판별 : https://velog.io/@joygoround/28.-%ED%9A%8C%EB%AC%B8-N-gram 참조
print(word == word[::-1]) # 원래 문자열과 반대로 뒤집은 문자열을 비교

def palindrome(word):
if word == word[::-1]:
print(word)
else: raise NotPalindromeError

profile
roundy

0개의 댓글