산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python에서 예외를 처리하지 않는 방법

많은 사람들이 예외를 잘못된 방식으로 처리하는 것을 봅니다. 아마도 이것은 당신에게도 적용될 것입니다. 다음 상황이 익숙합니까?

코드를 작성하고 있지만 사용 중인 라이브러리에서 예외가 발생할 수 있다는 것을 알고 있습니다. 당신은 정확히 기억하지 못합니다. 이 시점에서 소위 catch-all 블록을 사용하고 재미있는 것을 계속하고 싶은 유혹이 있습니다.

목차

<내비>

최악의 방법

당신이 할 수 있는 최악의 일은 무엇이든 잡아내는 try-except 블록을 만드는 것입니다. 포괄이란 다음과 같은 것을 의미합니다.

try:
    ...
except:
    pass

다음과 같은 포괄적인 차단은 다음과 같은 이유로 좋지 않습니다.

  1. 어떤 다른 예외가 발생할 수 있는지 알 수 없습니다(나중에 자세히 설명).
  2. 오류를 기록하는 대신 pass를 조용히 사용하여 예외를 숨기고 있습니다.

또한, KeyboardInterrupt을(를) 포함하여 모든 것을 catch하지 않으면 빈 예외가 발생합니다. (control + c), SystemExit , 심지어 NameErrors ! 즉, 다음 코드를 완전히 중지할 수 없습니다.

from time import sleep

while True:
    try:
        print("Try and stop me")
        sleep(1)
    except:
        print("Don't.. stop.. me now!")

부담 없이 사용해 보세요. 이 프로그램을 중지하려면 터미널 창을 닫거나 Python 프로세스를 종료해야 합니다.

모든 예외를 포착하는 좀 더 나은 방법

대조적으로 except Exception을 사용하는 경우 , 여전히 너무 많은 예외를 포착하는 빠르고 더러운 방법이지만 적어도 실행 중인 프로세스를 제대로 중지할 수 있습니다.

from time import sleep
while True:
    try:
        print("Try and stop me")
        sleep(1)
    except Exception:
        print("Ok I'll stop!")

Exception을 잡을 때 SystemExit을 잡지 못할 것입니다. , KeyboardInterrupt 및 기타 그러한 예외. 왜 그러세요?

모든 예외는 BaseException이라는 클래스에서 상속됩니다. . 공식 문서에 따르면:“try except가 있는 문 특정 클래스를 언급하는 절에서 해당 절은 해당 클래스에서 파생된 모든 예외 클래스도 처리합니다." 빈 except except BaseException와 동일합니다. , 따라서 가능한 모든 예외를 포착합니다.

대조적으로 Exception 클래스는 "모든 내장된 비시스템 종료 예외는 이 클래스에서 파생됩니다. 모든 사용자 정의 예외도 이 클래스에서 파생되어야 합니다."

더 나빠진다

다음 예에서는 os 라이브러리를 사용하여 현재 작업 디렉토리를 가져옵니다. 그러나 내 뚱뚱한 작은 손가락이 오타를 만들었습니다.

import os
try:
    working_dir = os.getcdw()
    print(working_dir)
except:
    print('error')

os.getcdw이기 때문에 os 모듈의 함수가 아닌 경우 NameError가 발생합니다. 실패하는 대신, except 절은 오류를 잡아내고 '오류'를 출력하고 우리의 노골적인 오타에도 불구하고 프로그램은 계속될 것입니다. 불행히도 이 문제는 Exception을(를) 잡아서 해결할 수 없습니다. 어느 쪽이든!

분명히 1단계의 작은 트릭이 모든 문제를 해결하는 것은 아닙니다. 따라서 해야 하는 우리는?

당신이 처리할 수 있는 것을 잡아라

예외에 대해 자주 듣는 문구는 다음과 같습니다. 처리할 수 있는 것을 잡아라 . 많은 개발자는 예외를 직접 처리하고 싶은 유혹을 받지만 실제로 예외를 처리할 수 있는 프로그램의 일부로 예외가 전파되도록 하는 것이 더 나은 경우가 많습니다.

예를 들어, 파일을 열고 로드하는 텍스트 편집기의 일부를 생각해 보십시오. 이를 OpenFile라고 부르겠습니다. 수업. 사용자가 존재하지 않는 파일을 열도록 요청한 경우 해당 오류를 직접 처리하거나 전파하도록 할 수 있습니다.

이 경우 호출자에게 예외를 전파하는 것이 좋습니다. OpenFile 이 예외가 호출자에게 얼마나 나쁜지 모릅니다. 발신자는 여러 가지 방법으로 상황을 처리할 수 있습니다.

어느 쪽이든 OpenFile가 아닙니다. FileNotFoundError의 경우 수행할 작업을 결정하는 클래스 .

그렇다면 예외는 항상 전파되어야 합니까? 아니요. FileOpen 클래스에서 처리할 수 있는 가능한 예외는 TimeoutError입니다. . 예를 들어, 호출자를 오류로 괴롭히지 않고 몇 번 재시도할 수 있습니다. OpenFile 처리할 수 있으므로 잡아서 다시 시도하는 것이 좋습니다.

결론

어떤 상황에서도 처리할 수 있는 것보다 더 많은 예외를 catch해서는 안 됩니다. 블록을 제외한 블랭킷은 버그와 예측할 수 없는 코드의 레시피입니다. 즉, 처리할 수 있는 것을 잡으십시오.

'처리할 수 있는 것을 잡아라'라는 매트릭스를 염두에 두고 코드를 작성하는 경우 포괄 블록을 작성하는 것은 모든 규칙을 위반하는 것입니다. 그러니 제발 그만하세요. 연습으로 기존 코드 중 일부를 다시 방문하여 이 새로운 지식으로 개선할 수 있는지 확인할 수 있습니다!


python

  1. 파이썬 연산자
  2. Python 오류 및 내장 예외
  3. Python 사용자 정의 예외
  4. Python에서 현재 날짜와 시간을 얻는 방법은 무엇입니까?
  5. Java catch 다중 예외
  6. 새 소프트웨어 교육에 서툴지 않는 방법
  7. Python Print() 문:예제로 인쇄하는 방법
  8. Python 사전 추가:키/값 쌍을 추가하는 방법
  9. Python 줄 바꿈:Python에서 줄 바꿈 없이 인쇄하는 방법
  10. Python Average:Python에서 목록의 AVERAGE를 찾는 방법