2010-01-27 9 views
8

예외를 발생시키고 단순히 오류를 인쇄하는 것과 다른 점은 무엇입니까? 단순히 대신예외 발생 및 인쇄 예외?

if size < 0: 
     raise ValueError('number must be non-negative') 

: 다음을 사용하는 장점이 뭐죠

예를 들어

,

if size < 0: 
     print 'number must be non-negative' 

내가 초보자 해요, 날 쉽게 확인하시기 바랍니다. :)

+3

이 코드를 사용하면 어떤 차이가 있습니까? –

답변

8

Raising an errorprinting 메시지가 단지 stdout에 무엇인가를 씁니다. 예외가 잡히지 않는 한 전체 프로그램이 중단됩니다. 출력이 다른 도구로 파이프되거나 다른 사람이 응용 프로그램을 실행하고 있지 않을 수 있습니다. 명령 줄 및 print 출력이 나타나지 않을 수 있습니다. |

yours.py number_source.txt :

if size < 0: 
    print 'size must be non-negative' 
else: 
    print size * 4 

와 나는 같은 스크립트를 호출

예를 들어, 코드 같은 것 인 경우 sum_all_lines.sh

yours.py이 숫자 사이에 일반 텍스트를 출력하는 경우 모든 숫자를 예상했기 때문에 sum_all_lines.sh이 실패합니다. 그러나 yours.py이 예외로 종료 된 경우 sum_all_lines.sh이 완료되지 않으며 합계가 실패한 이유가 분명해집니다.

물론 하나의 예일 뿐이지 만 특별한 경우는 완전히 다를 수 있습니다.

+2

이것을 생략했습니다. http : //docs.python.org/reference/simple_stmts.html#the-raise-statement 및 http://docs.python.org/reference/simple_stmts.html#the-print-statement. –

6

size < 0이 감지되는 시점에 size < 0을 처리 할 수 ​​있는지 여부에 따라 달라집니다. 그런 다음, 바로 print를 인쇄하여 처리 할 수있는 경우

, 그렇지 않으면,이 같이 더 호출 스택까지 뭔가 해당 조건의 처리를 위임, 예외를 발생 다음에

def divide_three_by(val): 
    if val == 0: 
    raise ValueError("Can't divide by 0") 
    return 3/val 

try: 
    divide_three_by(some_value_from_user) 
except ValueError: 
    print "You gave stupid input" 

을 ((예 : 매우 고안된) 예를 들어, divide_three_by 함수는 0을 전달할 때 수행 할 작업을 알지 못합니다. 메시지를 인쇄하려는 경우가 있습니다 (예 : val이 사용자 입력에서 왔을 때). 가끔은 무시할 수도 있습니다. , 기본값을 지정하십시오. 함수는 무엇을 해야할지 모르기 때문에 호출 스택 위로 호출 스택을 처리하는 책임을 건네야합니다. (그리고 거기에서 처리 할 수없는 경우 처리 할 때까지 호출 스택을 계속 전달할 것입니다. , 또는 최상위 레벨에 도달 할 때까지, 프로그램이 종료됩니다).

파이썬의 예외 처리에 대한 자세한 내용은 파이썬 설명서의 Errors and Exceptions tutorial을 참조하십시오.

+0

ZeroDivisionError (http://docs.python.org/library/exceptions.html#exceptions.ZeroDivisionError)의 존재를 고려하면 내 예제가 * 극도로 고안된 *임을 지적해야합니다. –

2

주요 차이점은 오류 검사 후 프로그램이 계속 실행되는지 여부입니다. 이 경우를 들어

:

if size < 0: 
    print 'number must be non-negative' 

이 단지 표준 출력과 수표를지나 계속 프로그램에 메시지를 인쇄합니다.따라서 나중에 코드에서 어느 시점에 size을 사용하면 0보다 적게 오류가 발생할 수 있습니다. 다른 경우를 들어

: 프로그램이 수표를지나 계속 진행되지 않습니다이 경우

if size < 0: 
    raise ValueError('number must be non-negative' 

는, 예외가 발생합니다. 처리되지 않으면 전체 프로그램이 종료됩니다.

대부분의 경우 예외를 발생시키고 예외를 포착하고 오류에 대한 사용을 알려주고 가능한 경우 입력을 다시 입력 할 수있는 외부 예외 처리기가 필요할 것입니다.

3

다른 고려 사항은 다른 프로그램에서 사용 된 모듈을 개발할 때입니다. 이 경우 예외를 발생시키고 호출 코드가 오류를 처리하도록하는 것이 바람직합니다. 호출자는 무언가가 잘못되어 그에 따라 행동해야 함을 알아야합니다.

... richie