exception이 발생하였을 때, 재시도를 r회 하는 로직은 생각보다 많이 쓰이게 됩니다. 어떻게 하는지 간단하게 알아보겠습니다.

 


 예제를 하나 보겠습니다.

 

 위 예제는 t = 1/0을 10번 재시도 하는 예제입니다. 보시면, t = 1 / 0 부분에서 계속 ZeroDivisionError가 뜨게 됩니다. 이 때, r이 retry보다 작으면 continue를 하고, 그렇지 않으면 raise를 하게끔 하였습니다. retry는 재시도 횟수인데요. 1부터 retry회까지 카운트가 됩니다. 고로, r이 retry보다 작다면 continue문을 타고, retry번 이상 재시도를 했다면 raise, 그러니까 예외를 발생시켜버리게 됩니다.

 

 10번 재시도를 하고, ZeroDivisionError가 뜨게 됩니다. 저 코드 제대로 동작할까요? 10번 재시도를 해도 exception이 계속 발생하면 raise를 한다. 문제 없어 보입니다. 그런데 아래 프로그램을 실행시켜 보겠습니다.

 

 이번에는 t = 1 / 2를 수행하였습니다. 1번만에 성공하였습니다. 그런데, 이거 retry가 몇 개나 찍힐까요?

 

 성공하였음에도 10번이 찍히게 됩니다. 1번만에 성공하면 재시도를 하지 말아야 하는데 그렇지 못한 이유는 for loop로 계속 돌아버리고 있기 때문입니다. 성공했다면, return을 하던지, 아니면 break를 걸어야 합니다.

 

 

 필요한 부분만 도식화 해서 그려보겠습니다. 10번동안 재시도 하는 로직이 바깥 for loop로 돌고 있어요. 그리고, 예외가 걸렸을 때, 재시도 횟수가 10회 이하이면 continue를 한다고 되어 있어요. 이는 for loop의 전체를 건너 뛴다는 의미입니다. 고로, 이 때에는 즉시 변수 retry가 하나 증가할 수 밖에 없습니다.

 

 그런데, except ~ 문에 걸리지 않는 경우에도 for loop 안에 있어요.

 

 

 이 경우 빨간색 화살표를 따라가게 됩니다. 핵심은 재시도 loop를 탄다는 점입니다. 언제까지? retry가 10이 넘어갈 때 까지 loop를 돌아버리게 됩니다.

 


 어떻게 하면 좋을까요? 예외에 걸리지 않은 경우에 바로 break나 return을 걸어버리면 됩니다. 아래 코드를 볼게요.

 

 except ~ 절에서 재시도 횟수가 retry 이하라면 contine를 걸고, 그 이상이라면 raise합니다. 예외에 걸리지 않으면 12번째 줄로 올 겁니다. 이 때에는 for loop 자체를 빠져나가야 합니다. 따라서 break를 걸어야 합니다. 이렇게 하면 어떻게 될까요? t = 1/2가 성공했기 때문에, 1번만 시도하게 됩니다.

 

 retry 1만 출력되게 됩니다.

 

 t = 1/0을 10번 시도하는 것은 잘 될까요?

 

 당연하게도 잘 됨을 볼 수 있습니다. 왜냐하면, 계속 excep ZeroDivisionError에 걸리기 때문입니다.

 

 

 이를 도식화 시키면 위와 같습니다. 예외에 걸리지 않으면 성공했기 때문에 더 이상 retry를 할 이유가 없습니다. 따라서, break 문으로 재시도 loop를 빠져나오면 되는 것입니다.