print - python:



파이썬에서 예외 또는 리턴 코드를 사용하는 것이 더 나은가? (4)

.NET에서 예외 사용에 대한 Microsoft의 권장 사항을 알고있을 수 있습니다.

성능 고려 사항

...

특별 조건을 위해서만 예외를 던져라.

또한 반환 코드가 충분하면 예외를 throw하지 마십시오.

(전체 텍스트보기 : http://msdn.microsoft.com/en-us/library/system.exception.aspx .)

비교의 요점으로, 파이썬 코드에서도 똑같이 추천 할 것입니까?

https://src-bin.com


Answer #1

pythonic 할 일은 예외를 발생시키고 처리하는 것입니다. 훌륭한 책 "Python in a nutshell"에서는 6 장의 '오류 검사 전략'에서 이에 대해 설명합니다.

이 책은 EAFP ( "허가보다 용서를 구하는 것이 더 쉽다")와 LBYL ( "도약하기 전에보십시오")에 대해 논의합니다.

그래서 귀하의 질문에 대답 :

아니요, 저는 파이썬 코드에도 똑같이 추천하지 않습니다. 간단히 말해서 파이썬 6 장을 읽으시기 바랍니다.


Answer #2

예외를 발생시키는 성능을 다음 코드와 비교하는 간단한 실험을했습니다.

from functools import wraps
from time import time
import logging

def timed(foo):
    @wraps(foo)
    def bar(*a, **kw):
        s = time()
        foo(*a, **kw)
        e = time()
        print '%f sec' % (e - s)
    return bar

class SomeException(Exception):
    pass

def somefunc(_raise=False):
    if _raise:
        raise SomeException()
    else:
        return

@timed
def test1(_reps):
    for i in xrange(_reps):
        try:
            somefunc(True)
        except SomeException:
            pass

@timed
def test2(_reps):
    for i in xrange(_reps):
        somefunc(False)

def main():

    test1(1000000)
    test2(1000000)

    pass

if __name__ == '__main__':
    main()

다음 결과로 :

  • 예외 발생 횟수 : 3.142000 초
  • return 사용 : 0.383000 초

예외는 return 사용할 때보 다 약 8 배 더 느립니다.


Answer #3

오류 코드를 반환할지 아니면 예외를 던질 지에 대해 생각하는 것이 매우 유효하며 언어 간 비교가 유용하고 유익 할 수 있습니다. 이 문제에 대한 매우 일반적인 대답은 단순히 함수에 대한 합법적 인 반환 값 집합을 가능한 한 작게 만들고 필요한만큼 크게해야한다는 것 입니다.

일반적으로, 주어진 메소드가 하나의 테스트 케이스에서 정수를 리턴하면, 사용자는 메소드가 항상 정수를 리턴 하거나 예외를 던질 것을 정당하게 기대할 수 있습니다. 그러나 개념적으로 가장 단순한 방법이 항상 물건을 다루는 최선의 방법은 아닙니다.

가장 가치가 낮은 값의 반환 값은 일반적으로 None . 당신이 그것을 들여다 보면, 그것이 None 의 가장 큰 의미라는 것을 알게 될 것입니다. 그것은 많은 경우에 False 평가되거나 더 이상의 계산을 금지하는 싱글 톤의 불변 값입니다. 연결, 아니 arithmetics. 따라서 문자열 입력에 대한 숫자를 반환하는 frob(x) 메서드를 작성하고 숫자가 아닌 문자열 및 기타 입력에 대해 None 을 작성 a=42+frob('foo') , 가짜 일이 일어난 지점에 매우 가까운 예외가 발생합니다. 물론, frob('foo')NOT NULL 로 정의되지 않은 데이터베이스 컬럼에 넣는다면 아마도 몇 달 후에 문제가 발생할 수 있습니다. 이것은 정당화 될 수도 있고 그렇지 않을 수도 있습니다.

따라서 문자열에서 숫자를 파생시키려는 대부분의 경우 소량의 float(x) 또는 int(x) 와 같은 somwething을 사용하는 것이 좋습니다. 이러한 내장 함수는 소화 가능하지 않을 때 예외를 발생시킵니다. 입력. 이것이 사용 사례에 맞지 않으면 사용자 정의 메서드에서 None 을 반환하는 것을 고려하십시오. 기본적으로이 반환 값은 소비자에게 '죄송합니다. 귀하의 의견을 이해할 수 없습니다.'라고 알려줍니다. 그러나 프로그램에서 계속 진행하는 것이 그 시점부터 의미가 있다는 것을 확실하게 알고있는 경우에만이 작업을 수행하려고합니다.

알다시피, 나는 방금 PHP에서 각주의 사항, 경고 및 오류 메시지를 잠재적으로 멈추는 예외로 변환하는 방법을 알아 냈습니다. 변수 이름의 오타 (typo)가 표준 PHP 설정에서 생성된다는 사실은 나를 미치게합니다. 이것은 너무 나쁘다. 이 프로그램은 전혀 이해가되지 않는 프로그램 코드로 일을 계속합니다! 사람들이이 기능을 찾았다는 것을 믿을 수 없습니다.

마찬가지로, 이것을 다음과 같이보아야합니다 : 특정 시점에서 합리적인 비용으로 코드 조각의 실행이 더 이상 의미가 없다고 주장 할 수있는 경우 - 값이 누락되었거나 범위를 벗어 났거나 예기치 않은 유형이거나 데이터베이스 연결과 같은 리소스가 다운 된 경우 디버깅 문제를 최소화하고 실행을 중단하고 사고를 처리 할 수있는 코드의 모든 수준까지 손을 제어해야합니다.

경험에 따르면 조기 작업을 삼가하고 가짜 값을 데이터에 들여 놓는 것이 디버깅하기가 더 어렵다는 것을 보여줍니다. 너무 열정적 인 타입 캐스팅의 많은 예가 있습니다 : 정수를 float에 추가하는 것이 합리적입니다. 숫자에 숫자를 추가하는 문자열을 허용하는 것은 이상한, 지역화되지 않은 오류를 생성하여 해당 데이터를 처리하는 임의의 주어진 줄에 나타날 수있는 가짜 사례입니다.


Answer #4

일반적으로, Python은 표현력을 목표로합니다.
나는 같은 원리를 여기에 적용 할 것이다 : 보통, 당신은 함수가 에러 코드가 아닌 결과 (이름과 함께!)를 리턴 할 것으로 기대한다.
이러한 이유로 일반적으로 오류 코드를 반환하는 것보다 예외를 발생시키는 것이 좋습니다.

그러나 MSDN 기사에서 언급 한 내용은 Python에도 적용되며 실제로 예외 대신 오류 코드를 반환하는 것과 관련이 없습니다.
대부분의 경우, 정상적인 흐름 제어 및 예상 상황 처리에 사용되는 예외 처리를 볼 수 있습니다. 특정 환경에서는 성능에 큰 영향을 미칩니다. 모든 환경에서 프로그램의 표현력과 유지 보수성에 큰 영향을 미칩니다.

예외는 정상적인 프로그램 흐름을 벗어나는 예외적 인 상황입니다. 어떤 일이 일어날 것으로 예상되면 직접 처리해야하며 기대하거나 처리 할 수없는 것을 제기해야합니다.

물론 이것은 조리법이 아니라 경험적 방법 일뿐입니다. 최종 결정은 항상 개발자와 컨텍스트에 달려 있으며 고정 된 지침 집합으로 명시 될 수 없습니다. 예외 처리를 위해서는 훨씬 더 진실입니다.





exception