2014-01-29 3 views
1

파이썬에서 조금 바뀐 코드를 가지고 있는데, 코드를 실행할 때 함수 정의 누락과 같은 언어 오류가 발생하지 않습니다. 함수 정의가 누락 된 스크립트를 계속 실행할 수 없다고 생각했습니다. 실행하기 전에 함수를 실제로 정의하려는 의도로 한 곳에서 함수를 사용했지만 코드를 잊어 코드를 실행했습니다. 근무 I가 update_parse_status()에 호출을 추가했는데 클래스입니다파이썬에서 언어 오류와 런타임 오류를 다르게 처리하기

Worker instance has no attribute update_parse_status 

- 놀랍게도 난 그냥 콘솔에 인쇄 된 다음 줄을 얻었다.

try: 
    Worker.update_parse_status() 
except Exception as e: 
    print e 

그래서 파이썬 그냥 AttributeError를 던져 내가 무의식적으로 그것을 잡는했다 -

은 내가 시도하고 일반적인 캐치이 같은 문제의 코드 주변의 모든 예외 핸들러를 가지고 있음을 깨달았다. 모든 예외 처리기를 잡을 필요가 없다는 것을 나에게 가르쳐주었습니다. 또한 컴파일 된 언어에서 오는 더 나은 방법이 처리 할 수 ​​있습니까? 파이썬이 언어 오류를 그냥 종료시키는 지 확인하는 방법이 있습니까? 명백한 버그를 최소한으로 제거하는 것은 매우 도움이 될 것입니다 (비록 나쁜 코드가 나를이 상황에 빠트 렸는지는 알지만).

+0

예외를 처리하지 않으면 (사용자의 경우) * catch하지 않습니다. 이런 식으로 제기되면 당신은 무슨 일이 일어나고 있었는지 정확하게 알려주는 멋진 추적을 얻을 수 있습니다.예외를 잡으면 처리하려는 * 가장 구체적인 * 예외를 잡으십시오. * 절대 사용하지 마십시오. '예외'또는 '예외 제외'. – Bakuriu

답변

2

파이썬에서 모든 이름은 런타임에 조회됩니다. 따라서 "언어"오류라고도하는 것은 런타임 오류와 다를 바 없습니다.

이렇게하면 파이썬이 다른 많은 언어와 구별됩니다. 그 사실의 장점 중 하나는 예를 들어 이름을 찾는 방법 (예 : 클래스의 __getattr__ 무시)을 쉽게 사용자 정의 할 수 있다는 것입니다.

프로그램을 실행하기 전에 일부 오류를 감지하는 애널라이저 (예 : pyflakes은 매우 유용하지만 많은 기능이 있음)를 사용할 수 있지만 도구로 모두를 감지 할 수는 없습니다.

+1

좋아요! pyflakes는 멋지다. 나는 적어도 내 테스트에서 실행되지 않는 경로의 뻔뻔스러운 오류를 말해달라고 할 수 있습니다. 그것을 줄 것이다. – user220201

+2

+1은 pyflakes를 언급하는 데 더하여, 예를 들어 VIM과 같은 많은 편집기에 통합 할 수 있습니다. – Oz123

+1

@ Oz123 - 편집자와의 통합이 더 좋습니다. 희망 이맥 안에 사용할 수 있기를 바랍니다. – user220201

1

귀하는 이미 자신의 질문에 답변했습니다. 당신이 너무 필요하지 않은 경우

  • 는 예외를 잡을 그러나 그것을 추적 할 몇 가지 로깅 메커니즘을 사용해야하는 경우
  • except Exception
  • 위험하다 ... 예외를 포착하지 마십시오.

마지막으로 파이썬이 오류를 종료하는지 확인하십시오. 프로그램의 흐름을 보장 할 필요가없는 곳에서는 예외를 catch하지 마십시오.

+0

나는 이것을 지금 알고있다 :) – user220201

0

파이썬은 통역사이기 때문에이 작업을 수행합니다. 이것을 극복하는 가장 좋은 방법은 단위 테스트입니다. unittest 모듈이 여기에서 도움이 될 수 있으며 setuptools가이 테스트를 실행할 수 있습니다. 이것들을 소스 배포판과 함께 패키지화 할 수도 있습니다.

물론 발견했듯이 포괄적 예외는 절대로 사용하지 마십시오. 그것은 또한 단위 테스트에서 잡을 수있는 오류를 숨 깁니다. 디버거를 개발할 때 디버거 아래에서 코드를 실행하여 더 쉽게 추적 할 수도 있습니다. catch-all을 사용하면 디버깅이 어려워집니다 (불가능할 수도 있습니다).

필림트 또는 pyflakes와 같은 도구를 사용하여 정적 분석을 수행 할 수도 있습니다.

관련 문제