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)는 항상 폐쇄된다.