python

[python] 예외 처리

전감자(◔◡◔) 2022. 9. 27. 18:03

* 예외처리 

① 예외 (exception) 

일반적으로 '에러' (error) 라고 부름 

에러가 발생하면 프로그램이 비정상적으로 종료된다. 

 

②예외 처리(exception handling)

문제 발생 코드를 수정하는 것이 아닌 그 이후의 코드를 이용하여 끝까지 프로그램이 실행될 수 있도록 한다.

'''
  예외 처리
'''

print("1>")

n = 0
result = 50 / n
print("result", result)

print("end 정상종료")

위 프로그램을 실행하면 ZeroDivisionError가 발생하기 때문에 end 정상종료가 출력되지 않고

비정상 종료된다. 

print("1>")
try:
    n = 0
    result = 50 / n
    print("result", result)
except ArithmeticError as e: # 다형성(polymorphism)
    #  ArithmeticError as e 가   e = ArithmeticError() 동일
    #  참조변수를  prinbt(e)하면 __str__(self) 호출된다.
    # division by zero 문자열이 출력되었기 때문에
    # __str__(self)가 리턴하는 값은 division by zero 라고 추측할 수 있다.
    # 재정의 했음.
    print("0으로 나누어서 예외가 발생", e) # division by zero

print("end 정상종료")

print(ZeroDivisionError.mro())
'''
[<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
'''

0으로 나누었을 때 발생하는 예외를 try ~ except 구문으로 예외 처리 해주었다.

 이 때 ZeroDivisionError 를 사용하지 않고 ArithmeticError 를 사용해도 정상 출력 된 이유는 

ArithmeticError가 ZeroDivisionError의 상위 클래스 이기 때문! 

 

만약 발생할 여러 에러의 상위 클래스가 같다면 상위클래스 하나만 쓰는게 더욱 효율적일 것임

 

https://docs.python.org/3/library/exceptions.html?highlight
=exception%20hierarchy#exception-hierarchy

에러 클래스들은 위의 사이트에 가면 자세히 볼 수 있다.

 

'''
  예외 처리
'''

print("1>")
try:
    n = 10
    result = 50 / n
    print("result", result)
except ArithmeticError as e: 
    print("0으로 나누어서 예외가 발생", e)
else:
    print("예외가 발생되지 않았을 때....")
finally:
    # 파이썬에서 외부 자원(DB,파일등)을 사용할 때는 반드시 쓸께요..(open함수), 사용후에는 잘 썼어요 ( close 함수 )
    print("예외발생여부와 상관없이 무조건 수행")

print("end 정상종료")


# 예외처리 목적이 아닌 반드시 수행되는 문장이 무엇인지를 알려주는 목적으로 사용됨.
try:
    print("999")
finally:
    print("success")

 

try:

    에러가 발생할 가능성이 있는 문장

except:

    에러가 발생했을 때 실행할 문장

else:

    에러가 발생하지 않았을 때 실행할 문장

finally:

    에러 발생 여부와 관계없이 반드시 실행할 문장

 



'''
  예외 처리
'''

print("1>")
try:
    #1. ZeroDivisionError 발생 가능한 코드
    n = 0
    result = 50 / n
    print("result", result)

    # 2. IndexError 발생 가능한 코드
    x = [10,20,30]
    print(x[10])

    # 문장
    # ..
# 1. 방법: 다중 except로 해결 ( 권장 )
except ZeroDivisionError as e:
    print("0으로 나누어서 예외가 발생", e)
except IndexError as e:
    print("리스트 잘못 접근", e)
except Exception as e: # 관례적으로 가장 마지막에는 Exception 으로 처리한다. 예상하지 못했던 예외발생시 처리할 수 있다. ( 안전판 )
    print("예외발생됨")

# 2 방법: 부모 예외클래스로 해결 ( 권장안함 )
# except Exception as e:
#     print("예외발생됨")

print("end 정상종료")

 

단, 가장 상위 에러 클래스인 Exception 부모클래스 하나만 쓰면

무슨 이유로 에러가 발생한 것 인지 모를 수 있기 때문에 권장하지 않는다.

 

'''
  예외 처리
'''
import traceback
print("1>")
try:
    #1. ZeroDivisionError 발생 가능한 코드
    n = 0
    result = 50 / n
    print("result", result)

    # 2. IndexError 발생 가능한 코드
    x = [10,20,30]
    print(x[10])

    # 문장
    # ..
# 1. 방법: 다중 except로 해결 ( 권장 )
except ZeroDivisionError as e:
    print("0으로 나누어서 예외가 발생", e) # division by zero
    print(traceback.format_exc())
except IndexError as e:
    print("리스트 잘못 접근", e)
    print(traceback.format_exc())
except Exception as e: # 관례적으로 가장 마지막에는 Exception 으로 처리한다. 예상하지 못했던 예외발생시 처리할 수 있다. ( 안전판 )
    print("예외발생됨")
    print(traceback.format_exc())

# 2 방법: 부모 예외클래스로 해결 ( 권장안함 )
# except Exception as e:
#     print("예외발생됨")

print("end 정상종료")

 

일반적으로 에러가 발생하면 빨간색 글씨로 에러가 뜨는데

traceback 패키지를 import 해주면 에러가 발생된 줄이 몇 번째 줄인지 

흰 색 글씨로 콘솔창에 함께 출력된다. 

 

 

 

 

'python' 카테고리의 다른 글

[python] 파일 처리  (0) 2022.09.28
[python] 날짜 데이터  (0) 2022.09.27
[python] 강제성 부여 추상클래스 | 매직 메서드  (0) 2022.09.26
[python] class 메서드 오버라이딩  (0) 2022.09.26
[python] class 상속 (inheritance)  (0) 2022.09.26