검색
검색
공개 노트 검색
회원가입로그인

[이솦] 파이선으로 배우는 AI 기초 13

요약
  • 프로그래밍에서 발생할 수 있는 예외 처리 방법과 그 중요성을 설명한다.
  • 예외 처리를 위해 파이썬에서 제공하는 'try except' 구문의 사용 방법을 소개한다.
  • 사용자 정의 예외를 만들어 보고, 실제 사용 예시를 통해 예외 처리 실습을 진행한다.

이솦 | EBS 소프트웨어·인공지능 교육

우리는 지금 수없이 많은 프로그램속에서 살고 있으며 프로그램을 실행할때마다 오류가 발생할 때가 있다. 우리가 버그라고 부르는데 보통은 실행시간오류 또는 논리 오류이다. 현재의 인공지능 시스템의 결과에는 한가지 문제가 있다. 딥러닝 등으로 결과가 나오면 그 결과가 버그인지 아닌지 알수가 없다.

일반적인 AI

학습용 데이터-> 머신러닝과정-> 학습된기능 -> 의사결정 또는 권로를 통해서 사용자에게 전달 ->과제로 다시 학습된 기능에 전달

왜 그런 결과를 나태내는지 이류를 모른다는 것이다. 그래서 인공지능 시스템에서는 버그라는 말이 어울리지 않는다. 그래서 최근에는 인공지능에서 어떻게 해서 그런 의사 결정을 만들어 냈는지를 설명하는 노력을 하고 있는게 그런 노력을 통틀어서 XAI라고 부른다.

XAI

학습용 데이터-> 새로운 머신러닝과정-> 설명가능한 모델, 설명을 위한 인터페이스->사용자- 과제로 다시 전달

즉 인공지능 시스템이 예측한 결과를 설명 가능한 형태로 제공해서 모델의 신뢰성을 높이는데 기여한다.

파이썬에는 기본적으로 예측가능한 버그를 막을수 있는 장치가 있다. 물론 이 기능은 파이썬만 있는게 아니라 다른 언어에서도 있다.

파이썬에서는 "Try except"문을 프로그램 실행중에 발생할수 있는 오류를 미리 대비할수 있다.

지난 시간에 배운 회문을 기반으로 회문이 아니면 예외를 발생시키는 예외 처리 방법을 배워보자.

Try except 구문

오류를 처리하는 방법을 알기전에 어떤 상황에서 오류가 발생하는지를 한번 알아보자.

오타같은 구문 오로가 아니라 실제 프로그램에서 자주 발생하는 오류를 중심으로 살펴본다.

파이썬에서 흔하게 발생하는 오류는 실행시 오류는 어떤수를 0으로 나누려고 하는것이다. 변수가 어떤것이 들어갈지 모르기 때문에 알수가 없다. 그래서 ZeroDivisionError 라는 에러를 볼수 있게 된다.

그외에에도 흔히 하는 실수가 리스트의 범위 밖의 값을 이용하려는 오류가 있다. 그럴때는 IndexError 를 발생 시킨다.

이런 오류를 대비해서 적당한 처리를 해주는것이 필요하다. 이런거를 보통 오류 처리라고 말하고 파이썬에서는 Try except구문이라고 말한다.

try:

실행할 코드

expcept:

예외가 발생했을 때 처리하는 코드

오류가 발생하지 않으면 except구문은 실행되지 않는다.

오류가 1개가 아니라 여러개 일때 어떻게 하는지 살펴보자

a = [10, 20, 30]
try:
    index, x = map(int, input('리스트 인텍스와 나눌 값 입력').split())
    print(a[index]/x)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("리스트의 범위를 벗어났습니다.")

15를 누르면 4.0이 나오고 35를 누르면 리스트 범위를 벗어났다는 메시지를 출력한다

예외가 발상하지 않았을 대에도 else및 finally문을 이용하면 기본적인 처리외에 다양한 처리를 할수 있다.

a = [10, 20, 30]
try:
    index, x = map(int, input('리스트인덱스와 나눌 값 입력').split())
    try:
        result = a[index] / x
    except ZeroDivisionError:
        print('0으로 나눌 수 없습니다.')
    except IndexError:
        print('리스트의 범위를 벗어났습니다.')
    else:  # This 'else' now aligns with the inner 'try' block
        print(result)
    finally:
        print("실행이 끝났습니다.")
except ValueError: # Added to catch errors if user enters non-numeric values
    print("숫자를 입력해야 합니다.")

1 3을 누르면 6.66 이 나온다. 리스트의 순번을 그다음 들어 가는 숫자로 나누게 된다.

0으로 나누려고 하려면 0으로 나눌수 없다와. 리스트를 벗어나는 것을 선택하면 오류 메시지를 출력하고 그렇지 않으면 결과를 출력하고 마지막으로 실행이 끝났습니다. 라는 메시지를 출력한다.

지금까지는 파이썬에서 정해준 예외를 사용했다. 이제는 직접 예외를 만들어 보자. 무슨 말이나면 지금 오류는 예측 가능한 오류 들이다. 이번에는 직접 예외를 발생시켜 보자.

try:
    height = int(input('키를 입력하세요:')) # Indent this line
    if height >=300:
        raise Exception("너무 큰값입니다.") 
    print(height) # Make sure this line is indented at the same level as the 'if' statement
except Exception as e:
    print("An error occurred:", e)

임의로 예외를 발생 시킬수 있으며 이렇게 예외를 발생 시킬때는 raise Exception("에러메시지") 를 사용한다. except Exception as e 로 사용해서 에러를 e로 저장하고 나중에 e를 출력해 주면 된다. 키가 300을 넘으면 안되라고 설정해 주고 그 후에 그 예외가 발생하면 예외가 발생했다고 출력해 주는 것이다.

이 예외도 파이썬 내부에서 사용하는 RuntimeError등을 이용해도 되지만 이렇게 직접 발생 시켜서 사용하기도 한다. 그 이유는 어떤껏 때문에 오류가 발생했는지 바로 알수 있기 때문이다.

파이썬에서 모든 오류에 대한 코드를 다 만들수는 없다는 것을 전제로 한다. 파이썬에서는 예외 클래스클 만들어서 사용할 수도 있다.

class MyError(Exception):
    def __init__(self):  # Indent the method definition
        super().__init__("괴물은 좋은 별명이 아니예요.")

try:
    a = input("별명을 입력하세요.")
    if a == "괴물":
        raise MyError
    print (a)
except Exception as e:
    print("예외가 발생했습니다.", e)

아직은 클래스를 배우지는 않았지만 이런식으로 사용할수 있다.

프로그램 수행도중에서 특수한 경우에만 예외처리를 하기 위해서 종종 예외를 만들어서 사용한다. 예외라는 클래스가 있는데 그걸 그대로 상속해서 만든다. 오늘은 MyError이라는 클래스로 예외를 만들었다고 생각해보자.

class MyError(Exception):

  • MyError라는 사용자 정의 예외 클래스를 정의합니다. 이 클래스는 기본 예외 클래스인 Exception을 상속받습니다.

def __init__(self): # Indent the method definition

  • MyError 클래스의 초기화 메서드(생성자)를 정의합니다. 이 메서드는 클래스가 인스턴스화될 때 호출됩니다.

super().__init__("괴물은 좋은 별명이 아니예요.")

  • 부모 클래스인 Exception의 초기화 메서드를 호출하며, 예외 메시지로 "괴물은 좋은 별명이 아니예요."를 전달합니다.

try:

  • try 블록을 시작합니다. 이 블록 안의 코드는 예외가 발생할 수 있는 코드입니다.

a = input("별명을 입력하세요.")

  • 사용자에게 별명을 입력받습니다. 입력받은 별명은 변수 a에 저장됩니다.

if a == "괴물":

  • 입력받은 별명이 "괴물"인지 확인합니다.

    raise MyError

  • 만약 입력받은 별명이 "괴물"이라면 MyError 예외를 발생시킵니다.

print (a)

  • 예외가 발생하지 않았다면, 입력받은 별명을 출력합니다.

except Exception as e:

  • try 블록에서 예외가 발생하면 이 블록이 실행됩니다. 발생한 예외는 e 변수에 저장됩니다.

print("예외가 발생했습니다.", e)

  • 예외가 발생했음을 알리는 메시지와 함께 예외 메시지를 출력합니다.

이렇게 코드를 설명할수 잇다.

파이썬에서는 기본적으로 제공하는 예외가 아닌 직접 예외를 만들어서 할수 있다.

실습

try excpet구문을 통해서 회문이 아니면 오류를 출력하는 걸 짜보자.

try:
    a = input('문장을 입력하세요')
    if a == a[::-1]:
        print(a)  # Indented to be part of the 'if' block
    else:
        raise Exception("입력한 값이 회문이 아닙니다.")  
except  Exception as e: 
    print("예외가 발생했습니다.", e)

3번째 줄을 통해서 꼭 반드시 3글자가 아닌 긴 글자에서도 첫 글짜와 마지막 글자가 같다면 회문으로 인식해서 출력해 준다.

정리

프로그램이 임의로 멈추거나 시스템에 문제를 일으키지 않기 이후서는 사전에 의도치 않은 예외를 처리해야 된다.

파이썬에서는 try~ except구문을 이용하여 예외를 처리하고 위험을 미리 방지 한다.

try~ except문과 if문을 함께 사용해서 조건에 따라 예외 처리한다.

공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
조회수 : 75
heart
T
페이지 기반 대답
AI Chat