cs

 

요즘 정말 너무 피곤하다... 


혼자 카페에서 공부할때나, 회사에서 분석 코드 쓰거나, 주식 트레이딩 코드 만지면서 가장 많이 본 단어는 'Error' 일것이다. 

친절하게도 어디에서 왜 틀렸는지 다 알려주기 때문에 우리 구선생 (구글링)을 통해서 다 해결은 하지만,, 암튼 오류 관련해서 공부해보자.

 

오류의 종류

  • 프로그램 실행 전에 발생하는 오류
    • 구문 오류(syntax error)
  • 프로그램 실행 중에 발생하는 오류 
    • 예외 (exception) or 런타임 오류 (runtime error)

 

구문 오류

구문 오류는 말그대로 내가 뭔가 잘못 코드에서 실수를 한거다.

특히 괄호나, 들여쓰기 등 이런것들이 프로그램이 실행되기 전에 문법?이 잘못된거라고 보면 좀 쉬울 것 같다.

바로 착하게, 구문 에러라고 말해주면서 line3번째에서 틀렸다고 까지 말해준다. 

 

EOL이라는 뜻은 End of Line이니까 마지막에 문제 있다고 알려주니, 얼마나 친절한가..

 

 

예외 

예외나 런타임은 위에서 잠깐 적은 것 처럼 실행 중에 발생하는 오류다. 

첫줄에 print는 잘 실행이 되었지만,  두번째에서 에러가 나면서, 그 이유는 list_a라는게 defined 되지 않았다라고 또 친절히 이야기해준다. 

 

list_a라는 친구가 아직 정의되지 않았으니, 이걸 정의시켜주면 되겠다. 

리스트는 0 부터 시작이기 때문에 (0, 1, 2 ...) 리스트의 두번째인 2를 가지고 왔다. 

 

간단간단.. 이번 챕터가 가장 책의 먼저 나와도 괜찮았을 것 같다.

 

기본 예외 처리

예외를 해결하는 모든걸 예외 처리라고 하는데 (exception handling) 두가지 방법이 있다. 

  • 조건문을 사용하는 방법
  • try구문을 사용하는 방법

 

If로 예외처리

예제의 코드를 가지고 와서 보자.

 

# 숫자를 정의하고
number_input = int(input("정수 입력>"))


# 출력합니다
print("원의 반지름:", number_input)
print("원의 둘레:", 2*3.14*number_input)
print("원의 넓이:", 3.14*number_input*number_input)

예제가 아주 맘에든다. 

 

암튼 결과도 당연히 예상한것처럼 바로 이쁘게 나와준다. 

 

하지만 정수를 입력하지 않으면 어떻게 되는가?

입력란에 '24로 해볼까유?' 라고 입력하면, 당연히 input값에 정수가 아닌 값이 들어갔기 때문에 반환을 못해준다. 

 

그럼 이러한 상황에서 애러가 아닌 쫌 더 친절한 값을 반환해주려면 어떻게 해야할까? 

 

# 숫자를 정의하고
user_input=input("정수입력>")

# 조건문으로 예외 처리를 해보자
if user_input.isdigit():
    #숫자로 변환한다
    number_input = int(user_input)
    print("원의 반지름:", number_input)
    print("원의 둘레:", 2*3.14*number_input)
    print("원의 넓이:", 3.14*number_input*number_input)
else:
    print("정수를 입력해주세요 :)")

if절을 통해서 조건을 걸어주었다. 

 

isdigit()함수는 숫자로만 구성된 글자인지 확인이 가능하다고 하다.

 

그래서 input자체가 숫자(정수)이면 아래의 print값을 출력하게 되고, 아니라면 정수를 입력해달라고 친절히 이야기해준다. 

 

 

try except 구문

책에 따르면 초기에는 조건문으로만 예외를 처리했다고 나온다, 하지만 모두 조건을 처리 하기에는 너무 힘들다고하여 try except구문을 만들었나보다. 

 

기본적인 구조는, 

try:

    예외 발생 가능성이 있는 코드

except:

    예외 발생시 실행할 코드 

 

예제로 바로 이해했다. 

#try except로 처리해보자
    
try:
    #숫자 변환
    number_input =int(input("정수입력>")) ##예외가 발생할 수 있다.
    #출력을하고
    print("원의 반지름:", number_input)
    print("원의 둘레:", 2*3.14*number_input)
    print("원의 넓이:", 3.14*number_input*number_input)
except:
    print("something wrong sir.")

보기에는 별거 다를 거 없어보이지만, try except를 쓰면 좀 더 복잡한 코드에서 활용이 더 쉬울 것 같다. 

 

 

try except 구문과 pass 키워드 조합

근데 프로그래밍을 하다보면, 어디에서 예외가 발생하는지 정확하게 파악하기가 힘들다.

 

또한 프로그램이 예외처리하면서 강제적으로 종료가 될 수도 있기 때문에 그것을 막는 것으로 except문에 아무것도 넣지 않고 pass를 시켜준다고 한다. 

 

#변수를 설정 
list_a = ["4", "13", "19", "23", "34", "41" , "로또번호?!"]

#반복을 적용시켜보고
list_number = []
for item in list_a:
    #숫자로 변환해서 리스트에 넣어주기
    try:
        float(item) #숫자로 처리하면서 
        list_number.append(item) #예외 없으면 리스트에 넣어주기
    except:
        pass

#출력한다
print("{}내부에 있는 숫자는".format(list_a))
print("{}입니다".format(list_number))

중간에 float(item)은 숫자로 변환할 수 없는 문자열이라면 예외가 발생하니, try except에서  예외가 없는 경우에만 list_number.append(item)을 실행되는 코드이다. 

 

조건도 깔끔하고, 원하는 것 처럼 리스트에서 숫자만 잘 긁어왔다. 

 

조건으로 빼버리지?않고 깔끔하게 정리 한 느낌. 

 

 

try except else 구문

상당히 다양한 종류의 예외 처리 방법이 있는듯 한데, try except else를 쓰게되면 예외가 발생하지 않았을 때 실행코드를 지정 가능하다.

#try except else

try:
    #숫자 변환
    number_input =int(input("정수입력>")) ##예외가 발생할 수 있다.
except:
    print("something wrong sir.")
else:
    print("원의 반지름:", number_input)
    print("원의 둘레:", 2*3.14*number_input)
    print("원의 넓이:", 3.14*number_input*number_input)

사실 저 위의 방식, 그냥 try에 다 넣어주면 안되나 라는 생각을 했는데, 뒤의 이 필자의 한 문장을 보고 생각이 바뀌었다. 

 

'하지만 몰라도 되는 것은 아닙니다. 그건 다른 문제입니다. 왜냐하면 다른 사람이 만든 코드를 이해할 때 필요하기 때문입니다. 따라서 기억은 해 두되, 편한 대로 사용하기 바랍니다.

 

지당하신 말씀이다. 내가 생각이 짧았구만 했다.. 

 

더 열심히 배워봅시다..!

 

finally구문

finally구문은 예외 처리 구문에서 가장 마지막에 넣을 수 있는 구문인데, 예외가 있던 없던 무조건 실행하게 하는 코드다. 

# finally 구문
try:
    #숫자 변환
    number_input =int(input("정수입력>")) ##예외가 발생할 수 있다.
    print("원의 반지름:", number_input)
    print("원의 둘레:", 2*3.14*number_input)
    print("원의 넓이:", 3.14*number_input*number_input)

except:
    print("something wrong sir!!!")
else:
    print("Everything is good sir.")
finally:
    print("Program is done, Sir.")

마지막 finally 구문은 예외가 있어도 실행이 되고, 없어도 실행이 된다. 

 

어떻게든 코드가 잘 돌아갔다 라고 말해준다..ㅎ

 

예외 처리를 통해서 좀 더 깔끔하게 예외에 대한 처리랑, finally 코드를 사용해 마지막 말을 해도 괜찮을 듯하다. 

 

'Data Analysis > Python_Grammar' 카테고리의 다른 글

[혼공파] 표준 모듈  (0) 2022.03.25
[혼공파] 예외 고급  (0) 2022.03.20
[혼공파] 함수 고급  (0) 2022.03.09
[혼공파] 함수의 활용 + (추가)  (0) 2022.03.02
[혼공파] 함수의 활용  (0) 2022.02.27

+ Recent posts