programing

"except: pass"가 잘못된 프로그래밍 관행인 이유는 무엇입니까?

luckcodes 2022. 10. 29. 16:08

"except: pass"가 잘못된 프로그래밍 관행인 이유는 무엇입니까?

Overflow 에서는 ada의 볼 수 있습니다.except: pass낙담하고 있습니다.왜안 ??때로는 에러가 뭔지 신경 쓰지 않고 코드를 계속 사용하고 싶을 때도 있습니다.

try:
    something
except:
    pass

왜 를 사용하는가?except: pass록이나??? ??★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★passexcept류는없??? ??

올바른 추측대로, 두 가지 측면이 있습니다.다음 시간 이후에 예외 유형을 지정하지 않고 오류를 검출합니다.except을 사용법

설명은 "조금" 더 길기 때문에 다음과 같이 요약됩니다.

  1. 실수하지 마세요.항상 복구할 준비가 된 예외를 지정하고 이러한 예외만 포착하십시오.
  2. 블록 이외에는 통과하지 않도록 합니다.명시적으로 원하지 않는 한 이것은 보통 좋은 징조가 아닙니다.

자세히 설명하겠습니다.

실수하지 마세요.

「」를하고 있는 경우try블럭, 일반적으로 예외가 발생할 가능성이 있다는 것을 알기 때문에 이 작업을 수행합니다.이와 같이, 어떤 문제가 발생할 수 있는지, 어떤 예외가 발생할 수 있는지에 대한 대략적인 개념도 이미 알고 있습니다.이 경우 예외를 확실하게 복구할 수 있기 때문에 예외를 포착할 수 있습니다.즉, 예외에 대한 준비가 되어 있고 예외의 경우 따를 수 있는 대체 계획이 있음을 의미합니다.

를 들어,할 때, 하려면 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 를 사용합니다.int()사용자에게 다시 시도하도록 요청하기만 하면 쉽게 복구할 수 있습니다.ValueError사용자에게 다시 프롬프트를 표시하는 것이 적절할 것입니다.다른 예로는 파일에서 일부 설정을 읽으려고 하는데 해당 파일이 존재하지 않는 경우를 들 수 있습니다.이 파일은 컨피규레이션파일이기 때문에 몇 가지 기본 설정이 폴백으로 되어 있을 수 있기 때문에 파일이 꼭 필요한 것은 아닙니다.따라서 를 포착하여 기본 설정을 적용하는 것이 좋습니다.이 두 경우 모두 예상되는 매우 구체적인 예외와 복구 계획이 있습니다.따라서, 각각의 경우에, 우리는 단지 명시적으로except 그런 예외는 없습니다.

그러나 모든 을 파악하게 되면 복구 준비가 되어 있는 예외 외에도 예상치 못한 예외나 복구할 수 없는 예외 또는 복구할 수 없는 예외도 발생할 수 있습니다.

위에서 컨피규레이션파일 예를 들어보겠습니다.파일이 누락된 경우 기본 구성을 적용했을 뿐이며 나중에 자동으로 구성을 저장하도록 결정할 수 있습니다(따라서 다음 번에는 파일이 존재합니다).이제, 대신, 또는 를 얻을 수 있다고 가정합니다.이 경우 기본 구성을 적용할 수는 있지만 나중에 파일을 저장할 수 없습니다.또, 유저도 커스텀 구성을 의도하고 있었을 가능성이 높기 때문에, 디폴트치를 사용하는 것은 바람직하지 않습니다.따라서 사용자에게 즉시 알리고 프로그램 실행도 중단하고 싶습니다.그러나 이는 작은 코드 부분 내에서만 수행하고자 하는 것이 아닙니다. 애플리케이션 수준의 중요도가 높기 때문에 가장 위에서 처리해야 합니다. 따라서 예외가 발생할 수 있습니다.

다른 간단한 예는 Python 2 idios 문서에도 언급되어 있습니다.여기 코드에는 단순한 오타가 존재하여 코드 파손이 발생합니다.모든 예외에 대응하고 있기 때문에및검출합니다.둘 다 프로그래밍 중에 우리에게 일어나는 실수이고 둘 다 코드 발송 시 절대 포함시키고 싶지 않은 실수입니다.그러나 이러한 정보도 검출되었기 때문에, 거기서 발생했는지조차 알 수 없고, 올바르게 디버깅할 수 있는 도움도 잃게 됩니다.

하지만 우리가 준비하지 못한 더 위험한 예외도 있다.예를 들어 System Error는 일반적으로 거의 발생하지 않으며 실제로 계획할 수 없습니다. 즉, 더 복잡한 일이 진행되고 있으며 현재 작업을 계속할 수 없는 원인이 될 수 있습니다.

어떤 경우에도 코드의 작은 부분에만 모든 준비가 되어 있을 가능성은 낮기 때문에 이 부분에서는 각오하고 있는 예외만을 파악해야 합니다.어떤 사람들은 적어도 잡으라고 제안합니다. 이런 것들은 포함되지 않을 것이기 때문입니다.SystemExit ★★★★★★★★★★★★★★★★★」KeyboardInterrupt당신의 지원서를 종료하도록 설계되어 있지만, 저는 이것이 여전히 너무 구체적이지 않다고 주장합니다.제가 개인적으로 캐치를 받아들이는 곳은 딱 한 곳뿐입니다.Exception또는 모든 예외에 해당하며, 이는 단일 글로벌응용 프로그램레벨 예외 핸들러에 있습니다.이 예외 핸들러는 준비되지 않은 예외를 로그에 기록하는 유일한 목적을 가지고 있습니다.이렇게 하면 예기치 않은 예외에 대한 많은 정보를 유지할 수 있으며, 이를 사용하여 코드를 확장하여 명시적으로 처리할 수 있습니다(예외에서 복구할 수 있는 경우). 또는 버그가 발생한 경우 테스트 케이스를 생성하여 다시 발생하지 않도록 할 수 있습니다.하지만 물론 이미 예상한 예외를 포착했을 경우에만 효과가 있기 때문에 예상하지 못했던 예외가 자연스럽게 터집니다.

블록 이외에는 통과하지 않도록 합니다.

특정 예외의 일부를 명시적으로 특정했을 때, 아무것도 하지 않고 있는 것만으로 되는 상황이 많이 있습니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★except SomeSpecificException: pass above above 의 경우,하게 되기 (상술한 바와 같습니다.단, 대부분의 경우 복구 프로세스와 관련된 코드가 필요할 가능성이 높기 때문에 (위에서 설명한 바와 같이) 그렇지 않습니다.예를 들어 액션을 다시 시도하거나 기본값을 설정하는 경우가 있습니다.

그렇지 않은 경우, 예를 들어 코드가 성공할 때까지 반복하도록 이미 구성되어 있기 때문에 통과만 하면 됩니다.위의 예를 들어 사용자에게 번호를 입력하도록 요구할 수 있습니다.유저는, 유저가 요구하는 것을 실시하지 않는 것을 좋아하기 때문에, 우선 루프에 넣어 두면, 다음과 같이 됩니다.

def askForNumber ():
    while True:
        try:
            return int(input('Please enter a number: '))
        except ValueError:
            pass

예외가 발생하지 않을 때까지 계속 시도하기 때문에 예외적인 블록에서는 특별히 할 필요가 없기 때문에 괜찮습니다.그러나 물론 사용자가 입력을 반복해야 하는 이유를 알려주는 몇 가지 오류 메시지를 보여주고 싶다고 주장할 수도 있습니다.

, 그냥 됩니다except우리가 잡은 예외에 대해 제대로 준비가 되어 있지 않았다는 증거입니다.하지 않은 예: " " " " " ) 。ValueError ★★★★★★★★★★★★★★★★★」TypeError합격할 수 있는 이유는 뻔하니까 그냥 합격하는 건 피하세요.실제로 할 일이 없는 경우(확실한 경우)에는 그 이유를 코멘트 추가하는 것을 검토해 주십시오.그렇지 않은 경우 예외 블록을 확장하여 실제로 복구 코드를 포함합니다.

except: pass

하지만 최악의 범죄자는 둘의 조합이다.이것은 우리가 전혀 준비가 되어 있지 않고 아무것도 하지 않지만 기꺼이 오류를 발견한다는 것을 의미합니다.적어도 에러를 로그에 기록하고, 애플리케이션을 종료하기 위해서 재작성할 필요가 있습니다(메모리 에러 후에 통상대로 계속할 가능성은 낮습니다).다만, 패스하는 것만으로, 애플리케이션을 어느 정도 유효하게 유지할 수 있을 뿐만 아니라(물론 어디에서 취득하느냐에 따라서), 모든 정보를 폐기해 버리기 때문에, 에러를 검출할 수 없게 됩니다.이것은 특히, 자신이 에러를 검출하고 있지 않은 경우에 해당됩니다.


결론은, 정말로 예상해, 회복할 준비가 되어 있는 예외만을 포착하는 것입니다.그 외의 모든 것은, 고쳐야 할 실수이거나, 어쨌든 준비가 되어 있지 않은 것일 가능성이 높습니다.만약 당신이 정말로 그것에 대해 무언가를 할 필요가 없다면, 특정 예외를 통과시키는 것은 괜찮습니다.다른 모든 경우, 그것은 단지 추측과 게으름의 표시일 뿐이다.그리고 당신은 분명히 그것을 고치고 싶어합니다.

여기서 가장 큰 문제는 모든 오류를 무시한다는 것입니다.메모리 부족, CPU 사용, 정지, 프로그램 종료, Jabberwocky로 인해 사용자 사망이 발생하고 있습니다.

이건 너무 심해요.머릿속에서는, 「이 네트워크 에러를 무시하고 싶다」라고 생각하고 있습니다.예기치 않은 문제가 발생했을 경우, 코드는 조용히 계속되어 아무도 디버깅할 수 없는 전혀 예측할 수 없는 방법으로 파괴됩니다.

그렇기 때문에 당신은 일부 오류만 특별히 무시하고 나머지는 그냥 지나쳐야 합니다.

의사 코드를 실행해도 오류는 발생하지 않습니다.

try:
    something
except:
    pass

처럼, 「코드의 조각」을 , 「코드의 조각」이라고 하는 것입니다.NameError이게 네가 원하는 게 아니길 바라.

"except: pass"가 잘못된 프로그래밍 관행인 이유는 무엇입니까?

왜 안 좋은 거죠?

try:
    something
except:
    pass

이것은 다음과 같은 모든 가능한 예외를 포착합니다.GeneratorExit,KeyboardInterrupt , , , , 입니다.SystemExit잡으려고 않는 예외일 -맞아요. -맞아요. -맞아요. -맞아요.BaseException.

try:
    something
except BaseException:
    pass

문서의 이전 버전은 다음과 같습니다.

시키므로 Python을 사용하면 가 발생합니다.except:는 많은 프로그래밍 오류를 런타임 문제처럼 보이게 하여 디버깅 프로세스를 방해할 수 있습니다.

Python 예외 계층

부모 예외 클래스를 잡으면 해당 클래스의 자식 클래스도 모두 잡힙니다.자신이 다룰 준비가 되어 있는 예외만을 포착하는 것이 훨씬 우아하다.

다음은 Python 3 예외 계층입니다. 정말 모두 잡으시겠습니까?

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

이러지마세요

다음과 같은 유형의 예외 처리를 사용하는 경우:

try:
    something
except: # don't just do a bare except!
    pass

될 거예요.somethingCtrl+C를 누르다.에서는, 「의 「예외」는됩니다.try코드 블록

다음으로 같은 바람직하지 않은 동작을 하는 예를 제시하겠습니다.

except BaseException as e: # don't do this either - same as bare!
    logging.info(e)

대신 찾고 있는 특정 예외만 파악하도록 하십시오.예를 들어 변환 시 값 오류가 발생할 수 있는 경우:

try:
    foo = operation_that_includes_int(foo)
except ValueError as e:
    if fatal_condition(): # You can raise the exception if it's bad,
        logging.info(e)   # but if it's fatal every time,
        raise             # you probably should just not catch it.
    else:                 # Only catch exceptions you are prepared to handle.
        foo = 0           # Here we simply assign foo to 0 and continue. 

다른 예를 사용한 상세 설명

'어쩌다' 이런 수도 있어요.UnicodeError그러나 가장 광범위한 예외 캐치를 사용했기 때문에 다른 근본적인 결함이 있을 수 있는 코드가 완료까지 실행되어 대역폭 낭비, 처리 시간 낭비, 기기 마모, 메모리 부족, 가비지 데이터 수집 등이 시도됩니다.

만약 다른 사람들이 당신의 코드를 믿을 수 있도록 당신에게 완료하라고 요구한다면, 저는 모든 것을 그냥 처리해야 한다는 것을 이해합니다.그러나 개발 중에 노이즈가 발생하더라도 문제를 해결할 수 있는 기회가 있습니다.이러한 문제는 간헐적으로 발생할 수 있지만 장기적인 버그입니다.

보다 정확한 오류 처리를 통해 코드를 보다 견고하게 만들 수 있습니다.

>>> import this

Python의 Zen, Tim Peters의

아름다운 것이 못생긴 것보다 낫다.
명시적인 것이 암묵적인 것보다 낫다.
단순한 것이 복잡한 것보다 낫다.
복잡한 것보다는 복잡한 것이 낫다.
플랫이 네스트보다 낫다.
촘촘한 것보다는 희박한 것이 낫다.
가독성이 중요합니다.
특별한 경우는 규칙을 어길 만큼 특별하지 않다.
비록 실용이 순수함을 이기긴 하지만.
오류는 절대 묵살해서는 안 됩니다.
명시적으로 침묵하지 않는 한.
애매모호함에 직면하여 추측의 유혹을 거부하라.
그것을 할 수 있는 확실한 방법은 하나, 그리고 가급적 하나뿐이어야 합니다.
네덜란드인이 아니라면 처음엔 그렇게 티가 나지 않을 수도 있지만요.
안 하는 것보다는 지금이 낫다.
하지만 지금보다 더 나은 경우는 없다.
구현에 대해 설명하기 어렵다면 이는 잘못된 생각입니다.
구현에 대해 설명하기 쉽다면 좋은 생각일 수 있습니다.
네임스페이스는 경적을 울리는 좋은 아이디어 중 하나입니다.그것들을 더 많이 해 봅시다!

자, 제 의견은 이렇습니다.오류가 발견될 때마다 이를 처리하기 위해 로그 파일 등에 기록해야 합니다.적어도 예전에는 오류가 있었음을 알려준다.

적어도 다음을 사용해야 합니다.except Exception:다음과 같은 시스템 예외를 발견하지 않도록 합니다.SystemExit또는KeyboardInterrupt여기 의사들 링크입니다.

일반적으로 원하지 않는 예외가 탐지되지 않도록 탐지할 예외를 명시적으로 정의해야 합니다.어떤 예외를 무시하는지 알아야 합니다.

첫째, Python의 Zen의 두 가지 원칙을 위반합니다.

  • 명시적인 것이 암묵적인 것보다 낫다.
  • 오류는 사일런트하게 전달되어서는 안 됩니다.

즉, 의도적으로 실수를 묵살하는 것입니다.또한 정확히 어떤 오류가 발생했는지 알 수 없습니다.except: pass예외는 없습니다.

둘째, Python의 Zen에서 벗어나 온전한 정신으로 이야기한다면except:pass에서는, 시스템에 지식이나 제어가 없습니다.경험의 법칙은 오류가 발생할 경우 예외를 발생시키고 적절한 조치를 취하는 것입니다.사전에 어떤 조치를 취해야 하는지 모르는 경우, 최소한 오류를 기록하십시오(예외를 다시 생성하는 것이 좋습니다).

try:
    something
except:
    logger.exception('Something happened')

하지만, 보통, 만약 여러분이 어떤 예외를 잡으려고 한다면, 여러분은 아마 뭔가 잘못된 을 하고 있을 거예요!

#1 이유는 이미 언급되어 있습니다.예상하지 않은 오류가 숨겨져 있습니다.

(#2) - 다른 사람이 코드를 읽고 이해하는 것을 어렵게 합니다.파일을 읽으려고 할 때 FileNotFoundException을 발견하면 다른 개발자는 'catch' 블록이 어떤 기능을 가져야 하는지 알 수 있습니다.예외를 지정하지 않으면 블록의 동작을 설명하기 위해 추가 설명이 필요합니다.

(#3) - 게으른 프로그래밍을 보여줍니다.일반적인 try/catch를 사용하면 프로그램에서 발생할 수 있는 런타임 오류를 이해하지 못하거나 Python에서 가능한 예외가 무엇인지 알 수 없음을 나타냅니다.특정 에러를 검출하면, Python이 송신하는 에러의 범위와 프로그램을 모두 이해하고 있는 것을 알 수 있습니다.이로 인해 다른 개발자 및 코드 리뷰어가 사용자의 작업을 신뢰하게 될 가능성이 높아집니다.

그럼 이 코드에서는 어떤 출력이 나올까요?

fruits = [ 'apple', 'pear', 'carrot', 'banana' ]

found = False
try:
     for i in range(len(fruit)):
         if fruits[i] == 'apple':
             found = true
except:
     pass

if found:
    print "Found an apple"
else:
    print "No apples in list"

이제 상상해보죠try-exceptblock은 복잡한 오브젝트 계층에 대한 수백 줄의 호출이며, 그 자체가 큰 프로그램의 호출 트리의 중간에 있습니다.프로그램이 잘못될 경우 어디서부터 찾아야 합니까?

except:pass건설은 기본적으로 코드가 포함된 동안 발생하는 모든 예외적인 조건을 침묵시킨다.try:블록이 실행되고 있습니다.

이러한 나쁜 관행을 만드는 것은 보통 여러분이 정말 원하는 것이 아니기 때문입니다.더 많은 경우, 어떤 특정 조건이 발생하여 침묵하고 싶은 경우가 있습니다.except:pass너무 무딘 도구라는 거죠작업을 완료할 수 있지만 예상치 못한 다른 오류 상태도 숨길 수 있지만 다른 방법으로 대처하고 싶을 수 있습니다.

Python에서 이것을 특히 중요하게 하는 것은 이 언어의 숙어에 따르면 예외가 반드시 오류는 아니라는 것입니다.물론 대부분의 언어에서와 마찬가지로 이러한 방식으로 사용되는 경우가 많습니다.그러나 특히 Python은 일부 코드 태스크의 대체 출구 경로를 구현하기 위해 종종 그것들을 사용했는데, 이것은 실제로 일반적인 실행 케이스의 일부가 아니지만, 여전히 종종 발생하는 것으로 알려져 있고 대부분의 경우 예상될 수도 있다. SystemExit이미 오래된 예로서 언급되었지만, 요즘 가장 일반적인 예는 다음과 같습니다.StopIteration특히 Python에 처음 반복기와 생성기를 도입했을 때, 이러한 예외를 사용하는 것은 많은 논란을 일으켰지만, 결국 그 아이디어는 널리 퍼졌다.

일반적으로 오류/예외는 다음 세 가지 카테고리하나로 분류할 수 있습니다.

  • 치명적: 당신 잘못이 아닙니다. 막을 수도 없고 회복할 수도 없습니다.프로그램을 알 수 없는 상태로 방치하고 무시하지 말고 계속 진행하십시오.이 오류로 인해 프로그램이 종료되면 어쩔 수 없습니다.

  • 본헤드:사용자의 오류입니다.아마도 과실, 버그 또는 프로그래밍 오류로 인해 발생할 수 있습니다.당신은 그 버그를 고쳐야 합니다.다시 한 번 말하지만, 무시하지 말고 계속 진행해야 합니다.

  • 외인성:파일을 찾을 수 없거나 연결이 종료되는 등 예외적인 상황에서 이러한 오류가 발생할 수 있습니다.이러한 오류와 이것만 명시적으로 처리해야 합니다.

모든 경우except: pass프로그램을 알 수 없는 상태로 둘 뿐이므로 더 큰 피해를 줄 수 있습니다.

지금까지 나온 코멘트는 모두 유효합니다.가능한 경우 무시할 예외를 지정해야 합니다.가능한 경우 예외의 원인을 분석하고 무시하려는 내용만 무시하고 나머지는 무시해야 합니다.예외로 인해 어플리케이션이 "스펙티브 크래시"되는 경우는 문제가 발생했음을 숨기는 것보다 발생 시 예기치 않은 상황을 파악하는 것이 훨씬 중요하기 때문입니다.

그렇다고 프로그래밍 연습을 가장 중요하게 여기지 마세요.이 멍청합니다.ignore-all-exceptions 차단에는 항상 시간과 장소가 있습니다.

바보같은 가장 중요한 것의 또 다른 예는 의 사용이다.goto교환입니다.내가 학교 다닐 때 교수님이 가르쳐 주셨다.goto오퍼레이터는 단지 그것을 사용하지 않을 것을 언급합니다, 절대.xyz를 사용해서는 안 되며, 도움이 되는 시나리오가 있을 수 없다는 말을 믿지 마십시오.항상 있다.

간단히 말해서, 예외나 오류가 발생한다면, 뭔가 잘못된 것이다.크게 잘못된 것은 아니지만, goto 문을 사용하기 위해 오류와 예외를 만들고, 던지고, 잡는 것은 좋은 생각이 아니며, 거의 수행되지 않습니다.99%는 어딘가에 문제가 있었습니다.

그 문제들은 처리되어야 한다.생활이나 프로그래밍에서와 마찬가지로문제를 그냥 내버려두고 무시하려고 하면문제가 저절로 없어지는 게 아니라 점점 커지고 늘어납니다.문제가 커지지 않도록 하기 위해 1) 문제를 제거하고 나중에 정리하거나 2) 문제를 억제하고 나중에 정리합니다.

예외나 오류를 무시하고 그대로 두면 메모리 누수, 미해결 데이터베이스 연결, 파일 권한에 대한 불필요한 잠금 등이 발생할 수 있습니다.

드문 경우지만, 이 문제는 매우 작고 사소한 문제이며, 시도와 포획 블록이 필요한 것 외에는 스스로 해결이 가능하기 때문에, 그 후에 정리할 수 있는 난장판이 전혀 없습니다.이 베스트 프랙티스가 반드시 적용되지 않는 유일한 경우입니다.제 경험상, 이것은 일반적으로 코드가 하고 있는 모든 것은 기본적으로 사소한 것이며, 재시도나 특별한 메시지와 같은 것은 복잡하거나 끈을 놓지 않는다는 것을 의미합니다.

저희 회사에서는 거의 항상 캐치블록에서 뭔가를 하는 것이 규칙입니다.아무것도 하지 않으면 항상 그럴만한 이유가 있는 코멘트를 달아야 합니다.해야 할 일이 있을 때는 절대로 빈 캐치블록을 통과하거나 남겨서는 안 됩니다.

내 의견으로는 오류는 나타나야 할 이유가 있다. 내 말이 바보같이 들리기 때문이다. 하지만 그것은 사실이다.좋은 프로그래밍은 오류를 처리해야 할 때만 발생합니다.또, 얼마전에 읽었던 「pass-Statement는 나중에 코드를 삽입하는 스테이트먼트입니다」라고 하는 것을 읽고 있기 때문에, 빈 스테이트먼트를 하고 싶은 경우는, 자유롭게 해 주세요만, 좋은 프로그램이라면, 필요한 것을 취급하지 않기 때문에, 부족한 부분이 있습니다.예외가 나타나면 입력 데이터를 수정하거나 데이터 구조를 변경하여 이러한 예외가 다시 발생하지 않도록 할 수 있습니다(그러나 대부분의 경우(네트워크 예외, 일반 입력 예외) 예외는 프로그램의 다음 부분이 제대로 실행되지 않음을 나타냅니다).예를 들어 네트워크예외는 네트워크 연결이 끊어진 것을 나타낼 수 있으며 프로그램은 다음 프로그램 단계에서 데이터를 송수신할 수 없습니다.

단, 하나의 execution-block에만 패스블록을 사용하는 것은 유효합니다.이는 예외 유형 간에 차이가 있기 때문입니다.따라서 모든 예외 블록을 1개에 포함하면 이 블록은 비어 있지 않기 때문입니다.

try:
    #code here
except Error1:
    #exception handle1

except Error2:
    #exception handle2
#and so on

다음과 같이 고쳐 쓸 수 있습니다.

try:
    #code here
except BaseException as e:
    if isinstance(e, Error1):
        #exception handle1

    elif isinstance(e, Error2):
        #exception handle2

    ...

    else:
        raise

따라서 pass-statement가 있는 여러 except-blocks에서도 특별한 유형의 예외를 처리하는 구조가 되는 코드가 발생할 수 있습니다.

아직 언급되지 않았기 때문에 다음 스타일을 사용하는 것이 좋습니다.

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

이 예에서는,somefile.tmp이 코드 블록이 어떠한 예외도 발생시키지 않고 실행된 후에는 존재하지 않습니다(단,FileNotFoundError(억제됩니다).

프로그래밍에서는 오류를 처리하는 것이 매우 중요합니다.사용자에게 무엇이 잘못되었는지 보여줘야 합니다.극히 일부의 경우 오류를 무시할 수 있습니다.이것은 매우 나쁜 프로그래밍 관행입니다.

만약 그것이 나쁜 관행이었다면 "합격"은 선택사항이 아닐 것이다.많은 장소에서 정보를 수신하는 자산(IE 폼 또는 사용자 입력)이 있는 경우 편리합니다.

variable = False
try:
    if request.form['variable'] == '1':
       variable = True
except:
    pass

데이터 센터에서 실행되는 애플리케이션을 구축하고 있습니다.에러를 생성하거나 예외를 발생시키지 않습니다.데이터센터에는 SNMP 트랩리시버를 포함한 네트워크 감시 시스템이 있습니다.

try:
    main()
except as e:
    log(str(e))
    send_snmp_trap(str(e))
    raise

하지만 그 인상은 아무데도 가지 않을 것이다. 왜냐하면 그 인상은 남아있을지도 모르기 때문이다.

그나저나 이건 만병통치약이 아니에요.잡히지 않는 예외가 있습니다.SNMP는 전달을 보증하지 않습니다.YMMV

저는 개인적으로 이 솔루션을 선호합니다.

except ValueError as error:
                print(error.args)
                pass

error.args특히 에러에 대해 다른 이유가 있는 경우, 너무 산만하지 않지만 코드 리뷰에 도움이 되는 원라이너를 제공합니다.

(ValueError('year 0 is out of range'),)
(ValueError('month must be in 1..12'),)
(ValueError('day is out of range for month'),)

기간을 두고 작업할 때pandas.

언급URL : https://stackoverflow.com/questions/21553327/why-is-except-pass-a-bad-programming-practice