2012-11-21 2 views
2

필자는 3 개의 초급 파이썬 책을 읽었지만 예외는 아직 이해하지 못했습니다.Python의 예외는 무엇입니까?

누군가 내게 높은 수준의 설명을주고 싶습니다. 그리고/또는 올바른 방향으로 나를 가르쳐 줄 수 있습니까?

나는 코드가 작동을 멈추게하는 코드 나 프로세스의 오류는 예외라고 생각합니다.

답변

1

그 중 가장 먼저 시작해야 할 부분은 파이썬의 list of built-in exceptions입니다.

누구나 원하는대로 오류를 던질 수 있으며 그 후에 잡아서 무시할 수 있습니다. if/else 대신에 처리를위한 예외를 사용하는 빠른 스 니펫은 여기에 있습니다. __get_site_file()은 경로 목록에서 파일을 찾을 수없는 경우 예외를 throw합니다. 그 특별한 예외에도 불구하고, 코드는 여전히 작동 할 것입니다. 그러나 코드는 파일이 있지만 권한이 읽기를 허용하지 않으면 실행을 중지하는 포착되지 않은 오류를 발생시킵니다.

def __setup_site_conf(self):             
    # Look for a site.conf in the site folder        
    try:                  
     path = self.__get_site_file('site.conf')        
     self.__site_conf = open(path).read()         
    except EnvironmentError:             
     self.__site_conf = self.__get_site_conf_from_template()    
-1

예외는 반드시 오류는 아닙니다. 그것들은 코드가 처리하는 방법을 알지 못하는 것을 만날 때 발생하는 것입니다. 이것은 코드를 작성하는 방법에 따라 완전히 수용 될 수 있습니다. 예를 들어 사용자에게 번호를 입력하도록 요청한다고 가정 해 보겠습니다. 그런 다음 텍스트 (문자열)를 가져 와서 숫자 (int)로 변환하려고합니다. 사용자가 넣으면 "cat"이라고 가정 해 보겠습니다. 예외가 발생합니다. 하지만 예외를 처리 할 수있는 코드를 만들 수 있습니다. 중단하지 말고 다시 시도하라는 작은 메시지를 사용자에게 제공하고 숫자를 사용하십시오. 이 링크를보고 내가 무슨 말을하고 있는지 확인하십시오 : http://www.tutorialspoint.com/python/python_exceptions.htm 또한 try, except (catch) 블록을 사용하여 예외를 처리합니다. 예 :

try: 
    integer = int(raw_input("Please enter an integer: ")) 
except Exception, exc: 
    print "An error has occured." 
    print str(exc) 

희망이 있습니다.

+3

파이썬에는 C 스타일의 캐스트가 없습니다. '(int) x'를'int (x)'로 대체하십시오. –

+2

@DanD : 글쎄, 여기에는 예외를 과시하는 미덕이있다. 불행히도,'SyntaxError'는 잡히는 것을 보여주지 않는'except' 핸들러에 의해 잡힐 것이기 때문에, 기회가 주어지기 전에 "당신은 숫자를 입력하지 않았습니다"라는 것을 보게 될 것입니다. 그것은 다소 혼란스러운 교훈이 될 것입니다 ... – abarnert

+0

@abarnert 저는 그것이 예라고 인정합니다. 그러나이 경우 예상되는 예외는 입력이 유효하지 않은 구문이 아니라면 숫자가 아닌 경우 'ValueError'의 예외가 될 것입니다. –

3

사람들이 어셈블리 언어 또는 C로 작성한 옛날에는 실패 할 수있는 함수를 호출 할 때마다 성공했는지 확인해야했습니다. 그래서 당신은 다음과 같은 코드를 가지고 것 :

def countlines(path): 
    total = 0 
    with open(path, 'r') as f: 
     for line in f: 
      total += int(line) 
    return total 

파이썬이 열 수없는 경우 :

def countlines(path): 
    f = open(path, 'r') 
    if not f: 
     print("Couldn't open", path) 
     return None 
    total = 0 
    for line in f: 
     value, success = int(line) 
     if not success: 
      print(line, "is not an integer") 
      f.close() 
      return None 
     total += value 
    f.close() 
    return total 
예외 뒤에 아이디어는 당신이 그 예외적 인 경우에 대해 걱정하지 않아도됩니다

, 당신은 그냥 쓰기 파일을 수정하거나 줄을 정수로 변환하면 파일을 자동으로 닫고 함수를 끝내고 전체 프로그램을 종료하고 유용한 디버깅 정보를 출력하는 예외가 발생합니다.

어떤 경우에는 프로그램을 종료하지 않고 예외를 처리하려고합니다. 당신이 예외를 달성하기 위해 노력하고 있다는 기본적인 생각을 알게되면, the tutorial 유용한 많은 정보를

while True: 
    path = input("Give me a path") 
    try: 
     print(countlines(path)) 
     break 
    except Exception as e: 
     print("That one didn't work:", e) 

예를 들어, 어쩌면 당신은 오류 메시지를 인쇄 한 후 다른 파일 이름을 사용자에게 물어보고 싶은.

배경을 더 원하면 Wikipedia이 도움이 될 수 있습니다 (기본 아이디어를 이해할 때까지 기사가 유용하지는 않지만).

여전히 이해할 수없는 경우보다 구체적인 질문을하십시오.

1

파이썬 문서 : 높은 수준의 설명은 http://docs.python.org/2/tutorial/errors.html

, 우리는 varA/varB를 나눌 말한다. 우리는 varB,하지만 우리가 검사에게 우리가 분열 할 때마다 수행하는 0 동일하지하지 않을 수 있습니다 수 있다는 사실을 알고 :

if varB != 0: 
    varA/varB 

우리는 조건부 첫째을 수행하지 않고 블록을 시도하는 예외를 사용하고 처리 할 수 ​​있습니다 try 블록에서 문제가 발생했는지 여부에 따라 프로그램의 동작. 당신이 실패 할 수 있습니다 방법을 알고있는 경우 http://docs.python.org/2/library/exceptions.html#exceptions.BaseException

, 그러나 다음 코드에서 varB == 0 있다면, '죄송합니다'콘솔로 인쇄됩니다 : 여기

try: 
    varA/varB 
except ZeroDivisionError: 
    print 'oops' 

사용할 수있는 예외의 목록입니다 , 파이썬 콘솔을 열고 예외가 발생한 것을 볼 수 있습니다 :

>>> 1/0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 
관련 문제