Python 3-예외 처리

Python은 Python 프로그램에서 예기치 않은 오류를 처리하고 디버깅 기능을 추가하기 위해 두 가지 매우 중요한 기능을 제공합니다.

  • Exception Handling− 이것은이 튜토리얼에서 다룰 것입니다. 다음은 Python- Standard Exceptions 에서 사용할 수있는 표준 예외 목록 입니다.

  • Assertions− 이것은 Python 3 튜토리얼의 Assertions에서 다룹니다 .

표준 예외

다음은 Python에서 사용할 수있는 표준 예외 목록입니다. −

Sr. 아니. 예외 이름 및 설명
1

Exception

모든 예외에 대한 기본 클래스

2

StopIteration

반복기의 next () 메서드가 어떤 객체도 가리 키지 않을 때 발생합니다.

SystemExit

sys.exit () 함수에 의해 발생합니다.

4

StandardError

StopIteration 및 SystemExit를 제외한 모든 내장 예외의 기본 클래스입니다.

5

ArithmeticError

숫자 계산에서 발생하는 모든 오류의 기본 클래스입니다.

6

OverflowError

계산이 숫자 유형에 대한 최대 한계를 초과 할 때 발생합니다.

7

FloatingPointError

부동 소수점 계산이 실패하면 발생합니다.

8

ZeroDivisonError

모든 숫자 유형에 대해 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

OSError

운영 체제 관련 오류로 인해 발생합니다.

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 예외를 발생시킵니다.

assert 구문은 다음과 같습니다.

assert Expression[, Arguments]

어설 션이 실패하면 Python은 ArgumentExpression을 AssertionError의 인수로 사용합니다. AssertionError 예외는 try-except 문을 사용하여 다른 예외처럼 포착 및 처리 할 수 ​​있습니다. 처리되지 않으면 프로그램을 종료하고 트레이스 백을 생성합니다.

다음은 주어진 온도를 켈빈에서 화씨로 변환하는 함수입니다. 0 ° K는 차갑기 때문에 음의 온도가 표시되면 함수가 종료됩니다.

#!/usr/bin/python3

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/python3

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/python3

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 절

다음과 같이 정의 된 예외없이 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:block은 try-block이 예외를 발생했는지 여부에 관계없이 실행해야하는 코드를 넣는 장소입니다. try-finally 문의 구문은 다음과 같습니다.

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note− except 절 또는 finally 절을 제공 할 수 있지만 둘 다 제공 할 수는 없습니다. finally 절과 함께 else 절을 사용할 수 없습니다 .

#!/usr/bin/python3

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")
   fh.close()

쓰기 모드에서 파일을 열 수있는 권한이 없으면 다음과 같은 결과가 생성됩니다.

Error: can't find file or read data

같은 예를 다음과 같이 더 깔끔하게 작성할 수 있습니다.

#!/usr/bin/python3

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")

이것은 다음 결과를 생성합니다-

Going to close the file

try 블록 에서 예외가 발생 하면 실행은 즉시 finally 블록 으로 전달됩니다 . finally 블록 의 모든 문 이 실행 된 후 예외가 다시 발생 하고 try-except 문의 다음 상위 계층에있는 경우 except 문 에서 처리됩니다 .

예외의 주장

예외 에는 문제에 대한 추가 정보를 제공하는 값인 인수가 있을 수 있습니다 . 인수의 내용은 예외에 따라 다릅니다. 다음과 같이 except 절에 변수를 제공하여 예외의 인수를 캡처합니다.

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

단일 예외를 처리하는 코드를 작성하는 경우 except 문에서 예외 이름 뒤에 변수를 지정할 수 있습니다. 여러 예외를 트래핑하는 경우 예외의 튜플 뒤에 변수를 지정할 수 있습니다.

이 변수는 대부분 예외 원인을 포함하는 예외 값을받습니다. 변수는 튜플 형식으로 단일 값 또는 여러 값을받을 수 있습니다. 이 튜플에는 일반적으로 오류 문자열, 오류 번호 및 오류 위치가 포함됩니다.

다음은 단일 예외에 대한 예입니다.

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as 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 Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note− 예외를 포착하기 위해 "except"절은 클래스 객체 또는 단순 문자열로 throw 된 동일한 예외를 참조해야합니다. 예를 들어, 위의 예외를 포착하려면 다음과 같이 except 절을 작성해야합니다.

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

다음 예제는 예외 발생의 사용을 보여줍니다-

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

그러면 다음과 같은 결과가 생성됩니다.

error in level argument -10

사용자 정의 예외

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