[TIL]파이썬 try-except 구문에서 pass 명령어에 대한 고민


이어드림 강의에서 예외 처리를 공부하던 도중 pass 명령어에 대해 궁금한 점이 생겼다. pass 명령어를 쉽게 설명하자면 신경쓰지말고 하던 일 계속하라는 뜻이다. 그런데 pass 명령어가 except 구문에 쓰일 때 try문에서 하던 일로 돌아갈지 궁금해졌다.

강의자료를 블로그에 올릴 수 없기 때문에 예시를 직접 만들어 보았다.

def remove_outlier(n):
    if n > 10:
        raise ValueError()
    return None

data = [1, 3, 7, 3, 20, 30]
count = 0

for num in data:
    try:
        remove_outlier(num)
        count += 1  # ValueError가 발생하고 pass 명령어를 실행했을 때 이 문장은 실행될까?

    except ValueError:
        pass

print("유효한 데이터의 개수:", count)

# 유효한 데이터의 개수: 4

여러 자연수가 담긴 data가 주어졌을 때, 1 ~ 10 사이의 값만 정상인 값이고 11부터는 이상치로 간주할 때, 정상인 데이터의 개수를 세는 코드이다.

remove_outlier 메서드에서 10보다 큰 숫자가 주어지면 강제로 ValueError를 발생시키고, 나중에 try - except 구문에서 이상치가 나오면 pass 명령어로 넘어간다.

이 때, try 구문 안에서 ValueError가 발생하고 pass 명령어를 실행했을 때, 뒷 문장인 count += 1는 실행되고 다음 for문으로 넘어갈까, 아니면 에러가 발생했으므로 무시하고 다음으로 넘어갈까?

결론적으로 6개의 데이터 중 4개의 데이터만 유효하다고 했으므로 뒷문장을 실행하지 않고 넘어간 것이다. 따라서 일종의 continue 명령어처럼 작용을 하였다.

다음은 예외처리를 사용하지 않고 만든 코드이다.

data = [1, 3, 7, 3, 20, 30]
count = 0

for num in data:
    if num > 10:
        pass
        count += 1  # 이 문장은 실행될까?
    else:
        count += 1

print("유효한 데이터의 개수:", count)

# 유효한 데이터의 개수: 6

여기서는 본래의 pass의 의미대로 뒤에있는 count += 1이 실행되어 유효한 데이터의 개수가 6개가 된다.

두 개의 가장 큰 차이점은 당연하지만 try - except 구문에 있다. 실행 흐름이 try문에서 예외가 발생하면 except문으로 넘어가고 except문에서 pass명령어가 있든 뭐가 있든간에 try문으로 돌아가지는 않는다. 따라서 pass명령어의 의미와 상관이 없는 문제였다.


글을 다 쓰고 보니 뭔가 당연한 얘기를 장황하게 설명한 느낌이 든다… -ㅅ-

try-except-finally를 아직 많이 접하지 않아서 아직 기본 개념이 명확하게 잡히지 않았던 것 같다. 코딩을 하다보면 이처럼 사소하지만 놓치기 쉬운 부분이 많은 것 같다. 앞으로도 부족한 부분을 열심히 채워 나가야겠다!


© 2020. All rights reserved.