Python-예외 처리
Python은 Python 프로그램에서 예기치 않은 오류를 처리하고 디버깅 기능을 추가하기 위해 두 가지 매우 중요한 기능을 제공합니다.
Exception Handling− 이것은이 튜토리얼에서 다룰 것입니다. 다음은 Python에서 사용할 수있는 표준 예외 목록입니다. Standard Exceptions .
Assertions− 이것은 Python 튜토리얼의 Assertions에서 다룰 것 입니다.
표준 예외 목록 −
Sr. 아니. | 예외 이름 및 설명 |
---|---|
1 | Exception 모든 예외에 대한 기본 클래스 |
2 | StopIteration 반복기의 next () 메서드가 어떤 객체도 가리 키지 않을 때 발생합니다. |
삼 | SystemExit sys.exit () 함수에 의해 발생합니다. |
4 | StandardError StopIteration 및 SystemExit를 제외한 모든 내장 예외의 기본 클래스입니다. |
5 | ArithmeticError 숫자 계산에서 발생하는 모든 오류의 기본 클래스입니다. |
6 | OverflowError 계산이 숫자 유형에 대한 최대 한계를 초과 할 때 발생합니다. |
7 | FloatingPointError 부동 소수점 계산이 실패하면 발생합니다. |
8 | ZeroDivisionError 모든 숫자 유형에 대해 0으로 나누기 또는 모듈로가 발생할 때 발생합니다. |
9 | AssertionError Assert 문이 실패한 경우 발생합니다. |
10 | AttributeError 속성 참조 또는 할당이 실패한 경우 발생합니다. |
11 | EOFError raw_input () 또는 input () 함수의 입력이없고 파일 끝에 도달하면 발생합니다. |
12 | ImportError import 문이 실패하면 발생합니다. |
13 | KeyboardInterrupt 사용자가 일반적으로 Ctrl + c를 눌러 프로그램 실행을 중단 할 때 발생합니다. |
14 | LookupError 모든 조회 오류에 대한 기본 클래스입니다. |
15 | IndexError 시퀀스에서 인덱스를 찾을 수 없을 때 발생합니다. |
16 | KeyError 지정된 키가 사전에 없을 때 발생합니다. |
17 | NameError 로컬 또는 글로벌 네임 스페이스에서 식별자를 찾을 수 없을 때 발생합니다. |
18 | UnboundLocalError 함수 또는 메서드에서 지역 변수에 액세스하려고하지만 값이 할당되지 않은 경우 발생합니다. |
19 | EnvironmentError Python 환경 외부에서 발생하는 모든 예외에 대한 기본 클래스입니다. |
20 | IOError 존재하지 않는 파일을 열려고 할 때 print 문 또는 open () 함수와 같은 입력 / 출력 작업이 실패 할 때 발생합니다. |
21 | IOError 운영 체제 관련 오류로 인해 발생합니다. |
22 | SyntaxError Python 구문에 오류가있을 때 발생합니다. |
23 | IndentationError 들여 쓰기가 제대로 지정되지 않은 경우 발생합니다. |
24 | SystemError 인터프리터가 내부 문제를 발견하면 발생하지만이 오류가 발생하면 Python 인터프리터가 종료되지 않습니다. |
25 | SystemExit sys.exit () 함수를 사용하여 Python 인터프리터가 종료 될 때 발생합니다. 코드에서 처리되지 않으면 인터프리터가 종료됩니다. |
26 | TypeError 지정된 데이터 유형에 대해 유효하지 않은 연산 또는 함수가 시도 될 때 발생합니다. |
27 | ValueError 데이터 유형의 내장 함수에 유효한 유형의 인수가 있지만 인수에 유효하지 않은 값이 지정된 경우 발생합니다. |
28 | RuntimeError 생성 된 오류가 어떤 범주에도 속하지 않을 때 발생합니다. |
29 | NotImplementedError 상속 된 클래스에서 구현해야하는 추상 메서드가 실제로 구현되지 않은 경우 발생합니다. |
Python의 어설 션
어설 션은 프로그램 테스트를 마쳤을 때 켜거나 끌 수있는 온 전성 검사입니다.
주장을 생각하는 가장 쉬운 방법은 그것을 raise-if성명서 (또는 더 정확하게 말하면, 비 승인 성명서). 표현식이 테스트되고 결과가 거짓이면 예외가 발생합니다.
어설 션은 버전 1.5에 도입 된 Python의 최신 키워드 인 assert 문에 의해 수행됩니다.
프로그래머는 종종 유효한 입력을 확인하기 위해 함수 시작 부분에, 그리고 유효한 출력을 확인하기 위해 함수 호출 후에 어설 션을 배치합니다.
어설 션 문
assert 문을 만나면 파이썬은 수반되는 표현식을 평가합니다. 표현식이 거짓이면 Python은 AssertionError 예외를 발생시킵니다.
그만큼 syntax 주장은-
assert Expression[, Arguments]
어설 션이 실패하면 Python은 ArgumentExpression을 AssertionError의 인수로 사용합니다. AssertionError 예외는 try-except 문을 사용하여 다른 예외처럼 포착 및 처리 할 수 있지만 처리되지 않으면 프로그램을 종료하고 추적을 생성합니다.
예
다음은 온도를 켈빈에서 화씨로 변환하는 함수입니다. 켈빈 0 도는 차갑기 때문에 음의 온도가 보이면 함수가 종료됩니다.
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
예외 란 무엇입니까?
예외는 프로그램 명령의 정상적인 흐름을 방해하는 프로그램 실행 중에 발생하는 이벤트입니다. 일반적으로 Python 스크립트가 대처할 수없는 상황이 발생하면 예외가 발생합니다. 예외는 오류를 나타내는 Python 객체입니다.
Python 스크립트가 예외를 발생 시키면 즉시 예외를 처리해야합니다. 그렇지 않으면 종료되고 종료됩니다.
예외 처리
당신은 어떤이있는 경우 의심스러운 예외를 제기 할 수 코드를, 당신은에 의심스러운 코드를 배치하여 프로그램을 방어 할 수try:블록. try : 블록 후에except: 문 뒤에 가능한 한 우아하게 문제를 처리하는 코드 블록이 나옵니다.
통사론
다음은 try .... except ... else 블록 의 간단한 구문입니다 .
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
다음은 위에서 언급 한 구문에 대한 몇 가지 중요한 사항입니다.
단일 try 문에는 except 문이 여러 개있을 수 있습니다. 이것은 try 블록에 다른 유형의 예외를 던질 수있는 문이 포함되어있을 때 유용합니다.
예외를 처리하는 일반 except 절을 제공 할 수도 있습니다.
except 절 뒤에 else 절을 포함 할 수 있습니다. else- 블록의 코드는 try : 블록의 코드가 예외를 발생시키지 않으면 실행됩니다.
else- 블록은 try : 블록의 보호가 필요하지 않은 코드를위한 좋은 장소입니다.
예
이 예제는 파일을 열고, 파일에 내용을 쓰고 전혀 문제가 없기 때문에 우아하게 나옵니다.
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
이것은 다음 결과를 생성합니다-
Written content in the file successfully
예
이 예제는 쓰기 권한이없는 파일을 열려고하므로 예외가 발생합니다.
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
이것은 다음 결과를 생성합니다-
Error: can't find file or read data
제외 없음 예외와 절
다음과 같이 정의 된 예외없이 except 문을 사용할 수도 있습니다.
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
이런 종류의 try-except문은 발생하는 모든 예외를 포착합니다. 이러한 종류의 try-except 문을 사용하는 것은 모든 예외를 포착하지만 프로그래머가 발생할 수있는 문제의 근본 원인을 식별하지 못하기 때문에 좋은 프로그래밍 관행으로 간주되지 않습니다.
여러 예외가 있는 except 절
다음과 같이 여러 예외를 처리하기 위해 동일한 except 문을 사용할 수도 있습니다.
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
try-finally 조항
사용할 수 있습니다 finally: 함께 차단 try:블록. finally 블록은 try- 블록이 예외를 발생했는지 여부에 관계없이 실행해야하는 코드를 넣는 장소입니다. try-finally 문의 구문은 다음과 같습니다.
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
finally 절과 함께 else 절을 사용할 수 없습니다 .
예
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
쓰기 모드에서 파일을 열 수있는 권한이 없으면 다음과 같은 결과가 생성됩니다.
Error: can't find file or read data
같은 예를 다음과 같이 더 깔끔하게 작성할 수 있습니다.
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
try 블록 에서 예외가 발생 하면 실행은 즉시 finally 블록 으로 전달됩니다 . finally 블록 의 모든 문 이 실행 된 후 예외가 다시 발생 하고 try-except 문의 다음 상위 계층에있는 경우 except 문 에서 처리됩니다 .
예외의 주장
예외 에는 문제에 대한 추가 정보를 제공하는 값인 인수가 있을 수 있습니다 . 인수의 내용은 예외에 따라 다릅니다. 다음과 같이 except 절에 변수를 제공하여 예외의 인수를 캡처합니다.
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
단일 예외를 처리하는 코드를 작성하는 경우 except 문에서 예외 이름 뒤에 변수를 지정할 수 있습니다. 여러 예외를 트래핑하는 경우 예외의 튜플 뒤에 변수를 지정할 수 있습니다.
이 변수는 대부분 예외 원인을 포함하는 예외 값을받습니다. 변수는 튜플 형식으로 단일 값 또는 여러 값을받을 수 있습니다. 이 튜플에는 일반적으로 오류 문자열, 오류 번호 및 오류 위치가 포함됩니다.
예
다음은 단일 예외에 대한 예입니다.
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
이것은 다음 결과를 생성합니다-
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
예외 제기
raise 문을 사용하여 여러 가지 방법으로 예외를 발생시킬 수 있습니다. 에 대한 일반 구문raise 진술은 다음과 같습니다.
통사론
raise [Exception [, args [, traceback]]]
여기서 Exception 은 예외 유형 (예 : NameError)이고 argument 는 예외 인수의 값입니다. 인수는 선택 사항입니다. 제공되지 않은 경우 예외 인수는 없음입니다.
마지막 인수 인 traceback도 선택 사항이며 (실제로 거의 사용되지 않음) 존재하는 경우 예외에 사용되는 traceback 객체입니다.
예
예외는 문자열, 클래스 또는 객체 일 수 있습니다. Python 코어가 발생시키는 대부분의 예외는 클래스의 인스턴스 인 인수가있는 클래스입니다. 새로운 예외를 정의하는 것은 매우 쉽고 다음과 같이 할 수 있습니다.
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
Note:예외를 포착하기 위해 "except"절은 클래스 객체 또는 단순 문자열에서 throw 된 동일한 예외를 참조해야합니다. 예를 들어, 위의 예외를 캡처하려면 다음과 같이 except 절을 작성해야합니다.
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
사용자 정의 예외
Python을 사용하면 표준 내장 예외에서 클래스를 파생하여 고유 한 예외를 만들 수도 있습니다.
다음은 RuntimeError 와 관련된 예제 입니다. 여기에서 RuntimeError 에서 서브 클래 싱 된 클래스가 생성 됩니다. 이는 예외가 발견 될 때보다 구체적인 정보를 표시해야 할 때 유용합니다.
try 블록에서 사용자 정의 예외가 발생하고 except 블록에서 포착됩니다. 변수 e는 Networkerror 클래스의 인스턴스를 만드는 데 사용됩니다 .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
따라서 위의 클래스를 정의하면 다음과 같이 예외를 발생시킬 수 있습니다.
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args