Latest web development tutorials

Python3 오류 및 예외

파이썬 초보자로서, 종종 몇 가지 오류 메시지가 표시 바로 파이썬 프로그래밍을 배우고, 우리는 우리가 헌신한다이 장 앞에 언급하지 않았다.

구문 오류 및 예외 : 파이썬이 쉽게 인식 오류가 있습니다.

구문 오류

파이썬 구문 오류 또는 잘못된 통화 분석, 초보자는 종종 예로서, 발생

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

이 콜론 (:) 누락되기 전에이 예에서, 함수 print ()는 오류를 확인한다.

파서는 그의 파티의 오류를 지적하고, 잘못된 장소에서 첫 번째 마커 작은 화살표를 찾을 수 있습니다.

이상

심지어 문법 파이썬 프로그램은,있을 수있는 오류를 실행하는 시간, 올바른 것입니다. 검출 된 런타임 오류는 예외라고합니다.

대부분은 여기에 오류 메시지가 표시 형태의 예외 핸들러되지 않습니다 :

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly

유형 ZeroDivisionError, 나가서 설명하자면 NameError 및 형식 오류의 예 : 다른 유형의 이상이 나타난다 이러한 유형의 정보의 일부로서 인쇄됩니다.

에러 메시지의 앞 부분은 예외 상황이 호출 스택을 발생하는 특정 정보의 형태로 디스플레이이다.

예외 처리

다음의 예는 사용자가 유효한 정수를 입력 할 수 있지만, 사용자는보기 (control-C 또는 설치된 운영체제 방법을 이용하여) 프로그램을 중단 할 수있다. 사용자 중단는 KeyboardInterrupt 예외가 발생합니다.

>>> while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")
   

다음 문 작업을 시도;

  • 첫째, (키워드와 시도 문을 제외 키워드 사이)를 시도 절
  • 예외가 발생하지 않는 경우, 절이 무시됩니다 제외 절은 실행 종료된다 시도합니다.
  • 예외가 시도 절 절차에서 발생하는 경우, 다음 절을보십시오, 나머지는 무시됩니다. 경기 후 제외한 이름과 예외의 유형은 다음 절을 제외하고 대응하는 경우 실행된다. 코드의 마지막 실행 후 문을보십시오.
  • 예외를 제외한 모든과 일치하지 않는 경우,이 예외는 상위 시도에 전달됩니다.

try 문은 다른 특정 예외를 처리하기 위해 절을 제외하고 하나 이상 포함 할 수있다. 대부분의 한 지점에서 실행됩니다.

만 해당 시도 절 예외 처리가 아닌 다른 시도 예외 핸들러에 대한 핸들러.

절을 제외하고는, 예를 들어, 튜플로 괄호에 배치됩니다 여러 예외를 처리 할 수 ​​있습니다 :

    except (RuntimeError, TypeError, NameError):
        pass

예외의 이름을 무시할 수 있습니다 절을 제외하고 마지막으로, 그것은 와일드 카드로 처리됩니다. 오류 메시지를 인쇄하려면이 방법을 사용하고 다시 발생 할 수 있습니다.

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

문이 옵션 다른 조항이 제외하고이 절을 사용하는 경우, 조항을 제외하고 결국 배치해야합니다,보십시오. 이 절은 시도 절이 실행에 문제가 발생하지 않습니다. 예를 들면 :

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

예기치을 피하기 위해 더 나은입니다 시도 절에있는 모든 문보다 다른 절을 사용하지만, 그들은 예외를 catch하지 않았다 제외.

예외 처리는 직접 절을보십시오 발생하는 예외를 처리 할뿐만 아니라 발생 핸들러 절 (심지어 간접 함수 호출)를 호출 할 수 없습니다. 예를 들면 :

>>> def this_fails():
        x = 1/0
   
>>> try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

예외를 던져

파이썬은 지정된 예외를 발생하는 throw 문을 사용합니다. 예를 들면 :

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

하나의 매개 변수가 발생 할 수있는 예외를 지정 올립니다. 이 클래스 또는 이상 (즉, 예외 서브 클래스)의 특별한 인스턴스 여야합니다.

당신이 예외가 발생하는 경우 알고 싶은 경우에, 그것을 처리하지 않는 한 다음 간단한 문이 다시 발생을 올릴 수 있습니다.

>>> try:
        raise NameError('HiThere')
    except NameError:
        print('An exception flew by!')
        raise
   
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
NameError: HiThere

사용자 정의 예외

당신은 새로운 예외 클래스를 작성하여 자신의 예외를 가질 수 있습니다. 예외는 예외 클래스에서 상속 직접 예를 들어, 간접적으로 승계를 상속 또는한다 :

>>> class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
   
>>> try:
        raise MyError(2*2)
    except MyError as e:
        print('My exception occurred, value:', e.value)
   
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

이 예에서, 클래스 예외 기본 __init의 __ ()는 덮어 씁니다.

이상 일반적인 방법의 다양성을 던질 수있는 모듈을 만들 때이 패키지의 기본 예외 클래스를 만드는 것입니다 다음 다른 오류 조건에 대해 서로 다른 하위 클래스를 만들려면이 기본 클래스를 기반으로 :

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

명칭의 대부분은 이상과 같은 표준 명명 같이 끝에서 "오류"에 대한 예외이다.


정의 정리 행동

try 문은 어떤 상황에서 청소 동작을 수행 정의하는 또 다른 선택적 절을 보유하고 있습니다. 예를 들면 :

>>> try:
        raise KeyboardInterrupt
	finally:
        print('Goodbye, world!')
   
Goodbye, world!
KeyboardInterrupt

에 관계없이 위의 예제의 마지막 절은 실행되고, 예외가 발생하지가, 절을보십시오.

은 try 절에서 (또는을 제외하고 다른 절) 예외가 밖으로 던져했지만,이 중지 제외한 모든이없는 경우 최종적으로 절을 실행 한 후, 다음이 다시 발생합니다.

여기 (제외 마지막 절 시도에서 동일한 문에 포함 된) 더 복잡한 예입니다 :

>>> def divide(x, y):
        try:
            result = x / y
        except ZeroDivisionError:
            print("division by zero!")
        else:
            print("result is", result)
        finally:
            print("executing finally clause")
   
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

사전 정의 된 정리 동작

일부 개체에 관계없이 시스템이 성공적으로 한번 필요하지 않은 사용 여부,이 표준 동작을 실행 정리, 표준 청소 동작을 정의합니다.

이 예는이 팀은 파일을 열고 다음 화면의 내용을 인쇄하려고 보여줍니다 :

for line in open("myfile.txt"):
    print(line, end="")

이 코드를 사용하여 위의 문제는 파일이 열린 상태로 유지 될 때 완료, 종료되지 것입니다.

파일과 같은 문 키워드을 보장 할 수있는 개체는 자신의 정화 방법의 올바른 실행을 사용하여 종료됩니다

with open("myfile.txt") as f:
    for line in f:
        print(line, end="")

위의 코드가 완료되면, 짝수 과정에서 문제가있는 경우, 파일 (F)는 항상 폐쇄된다.