python try except python handling exception with examples
이 자습서에서는 프로그래밍 예제의 도움으로 Try Except 블록을 사용하여 Python의 예외 처리를 설명합니다.
두 가지 오류 유형으로 인해 Python 프로그램이 갑자기 중지 될 수 있습니다. 구문 오류 , 및 예외 . 이 자습서에서는 몇 가지 중요한 항목에서 두 번째 오류 유형 (예외)에 대해 설명합니다.
애플리케이션에서 다음과 같은 예외를 처리하면 많은 이점을 얻을 수 있습니다.
- 강력한 응용 프로그램 만들기.
- 깨끗하고 오류없는 코드 생성.
=> 독점 Python 교육 자습서 시리즈를 보려면 여기를 방문하십시오.
학습 내용 :
파이썬은 예외를 시도
한 가지 좋은 소식은 Python에는 코드에서 오류를 포착하기위한 많은 내장 예외가 있다는 것입니다. 또한 기본 제공 예외가 우리의 요구에 맞지 않을 때 사용자 지정 예외를 만들 수있는 기회를 제공합니다.
예외 란?
그렇다면 파이썬의 예외는 무엇입니까? 간단히 말해서 Python 인터프리터가 잘못된 코드를 실행하려고 할 때마다 예외가 발생하고 이러한 예외가 처리되지 않는 경우 프로그램 명령의 정상적인 흐름을 방해하고 트레이스 백을 인쇄합니다.
잘못된 코드를 만들고 Python 인터프리터가 어떻게 응답하는지 살펴 보겠습니다.
Python 셸을 열고 다음 코드를 실행합니다.
>>> 50/0
이것은 프로그래밍에서 가장 흔한 오류 중 하나입니다. 위의 코드는 숫자를 나누려고합니다. 오십 으로 0 (제로). 파이썬 인터프리터는 이것을 유효하지 않은 연산으로보고 ZeroDivisionError , 프로그램을 중단하고 역 추적을 인쇄합니다.
우리는 명확하게 볼 수 있습니다 ZeroDivisionError 발생한 예외입니다. 숫자를 0으로 나누는 것이 좋지 않다고 말하는 것은 실제로 Python의 고유 한 방법입니다. JavaScript와 같은 다른 언어에서는 이것은 오류가 아닙니다. 파이썬은이 관행을 엄격히 금지합니다.
또한 이것은 예외 객체 일 뿐이며 Python에는 이러한 객체가 많이 내장되어 있음을 아는 것이 중요합니다. 이 Python 공식을 확인하십시오. 선적 서류 비치 모든 Python 내장 예외를 확인하십시오.
역 추적 이해
예외를 처리하기 전에 예외가 처리되지 않으면 정확히 어떤 일이 발생하는지 그리고 파이썬이 오류에 대해 알려주기 위해 최선을 다하는 방법을 이해하는 것이 도움이 될 것이라고 생각합니다.
Python은 오류가 발생할 때마다 예외를 발생시킵니다. 이 예외가 처리되지 않으면 Traceback이라는 정보가 생성됩니다. 그렇다면이 트레이스 백에는 어떤 정보가 포함되어 있습니까?
다음을 포함합니다.
- 발생한 예외와이 예외가 발생하기 전에 발생한 상황을 알려주는 오류 메시지입니다.
- 이 오류를 일으킨 코드의 다양한 줄 번호입니다. 오류는 a라는 일련의 함수 호출로 인해 발생할 수 있습니다. 콜 스택 나중에 여기서 논의 할 것입니다.
약간 혼란 스럽지만 다음 예제가 우리의 이해에 더 많은 빛을 가져올 것이라고 약속합니다.
위의 50을 0으로 나누어 인쇄 한 트레이스 백을 상기하면 트레이스 백에 다음 정보가 포함되어 있음을 알 수 있습니다.
- 파일 '':이 코드가 콘솔 터미널에서 실행되었음을 알려줍니다.
- 1 행 :이 행 번호에서 오류가 발생했음을 알려줍니다.
- ZeroDivisionError : 나누다 제로: 발생한 예외와 원인을 알려줍니다.
다른 예를 시도해 보겠습니다. 콜 스택 처럼 보입니다. 편집기를 열고 아래 코드를 입력하고 다른 이름으로 저장하십시오. tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
이 파일이있는 디렉토리에서 터미널을 열고 실행하십시오.
python tracebackExp.py
다음과 같은 트레이스 백이 표시됩니다.
위의 트레이스 백은 혼란스러워 보일 수 있지만 실제로는 그렇지 않습니다. Pythonistas는 역 추적을 읽는 가장 좋은 방법을 제시했습니다. 상향식 . 따라서이 지혜를 사용하여이 트레이스 백이 제공하는 것이 무엇인지 이해해 보겠습니다.
- 맨 아래에서 발생한 예외와 발생 이유를 얻습니다.
- 위로 이동하면 파일 이름이 표시됩니다. tracebackExp 이 오류가 발생한 .py,이 오류를 일으킨 계산 = numb / div, 함수 stack2 및이 계산이 수행 된 링크 번호 6 행.
- 위로 이동하면 stack2 함수가 3 행의 stack1 함수에서 호출되었음을 알 수 있습니다.
- 맨 위로 이동하면 stack1 함수가 11 번 줄에서 호출 된 것을 볼 수 있습니다.< 기준 치수 >는 실행중인 파일임을 알려줍니다.
일반적인 Python 예외
Python 라이브러리는 엄청나게 많은 내장 예외를 정의합니다. Python 문서를 확인하거나 내장 된 현지 () 기능 :
>>> dir(locals()('__builtins__'))
우리는 이러한 모든 예외를 해결하려고 노력하지 않을 것이지만, 귀하가 접하게 될 몇 가지 일반적인 예외를 보게 될 것입니다.
# 1) 유형 오류
부적절한 유형의 객체에 연산 또는 함수가 적용될 때 발생합니다.
예 1
아래 프로그램을 고려하십시오. 피제수와 제수를받은 다음 피제수를 제수로 나눈 결과를 계산하고 인쇄합니다.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
사용자에게 피제수와 제수의 값을 요청하지만 제수의 문자열 값을 정수로 변환하는 것을 잊었습니다. 따라서 배당금 유형은 정수 ( int ) 및 제수 유형은 문자열 ( 피 ). 그런 다음 TypeError 나누기 연산자 (/)는 문자열에서 작동하지 않기 때문입니다.
Python과 달리 Javascript에는 기본적으로 피연산자가 다른 유형일 때 피연산자의 유형 중 하나를 다른 피연산자의 유형과 동등한 값으로 변환하는 유형 강제 변환이 있다는 것을 아는 것이 흥미로울 것입니다.
# 2) ValueError
이것은 연산이나 함수가 올바른 유형이지만 부적절한 값을 가진 인수를받을 때 발생합니다.
예 2
Visual Studio 팀 서비스 란?
우리 프로그램을 예 1 위.
사용자가 '3a'와 같은 배당금에 영숫자 값을 입력하면 프로그램에서 ValueError 예외가 발생합니다. 이것은 파이썬이 int () 메소드는 임의의 숫자 또는 문자열을 받아서 정수 객체를 반환합니다. 문자열 값에는 문자 나 숫자가 아닌 값이 포함되어서는 안됩니다.
# 3) AttributeError
이 예외는 존재하지 않는 속성을 할당하거나 참조하는 동안 발생합니다.
예제 3
아래 프로그램을 고려하십시오. 숫자를 받아 다음을 사용하여 제곱근을 계산합니다. Python 수학 모듈
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root
사용자가 숫자를 입력하면 우리 프로그램은 수학 모듈의 함수를 사용하여 제곱근을 계산하려고하지만 여기서는 오류가 발생했습니다. sqrt 대신 수학 모듈에없는 sqr을 실수로 입력했습니다.
그래서 우리는 존재하지 않는 sqr 속성을 참조하려고했으며 AttributeError 예외가 발생했습니다. 우리 대부분은 이런 종류의 실수를 많이합니다. 그래서 당신은 혼자가 아닙니다.
Try Except로 예외 처리
프로그래머로서 우리 대부분이 시간을 할애 할 한 가지는 탄력적 인 강력한 코드를 작성하는 것입니다. 일부 오류로 인해 깨지지 않는 코드. 파이썬에서는 문장을 시험 - 외 성명서.
Python Try-Except 문
try-except 문은 다음과 같은 구조를 갖습니다.
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
코드를 tracebackExp try-except 문 내부의 .py.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15
이 코드를 실행하면 출력이 생성됩니다.
이것이 try-except 문이 작동하는 방식입니다. Python은 try 블록에서 코드를 실행합니다. 7-8 행 . 유효하지 않은 코드가 없으면 except 블록의 코드 10 행 건너 뛰고 실행이 계속됩니다.
그러나 유효하지 않은 코드가 발견되면 try 블록에서 즉시 실행이 중지되고 발생한 예외가 except 문에서 제공 한 것과 일치하는지 확인합니다. 9 행 . 일치하면 except 블록이 실행되고 계속됩니다. 그렇지 않으면 프로그램이 중단됩니다.
try-block에는 일반적으로 except-block이 예외를 포착하고 처리하는 동안 예외를 발생시킬 수있는 코드가 포함됩니다.
Except로 여러 예외 처리
단일 '예외'또는 여러 '예외'로 여러 예외를 처리 할 수 있습니다. 그것은 모두 당신이 각 예외를 어떻게 처리하고 싶은지에 달려 있습니다.
# 1) 단일 예외로 여러 예외 처리
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
이 방법은 코드가 다른 예외를 발생시킬 수 있다고 의심되고 각 경우에 동일한 조치를 취하고 자 할 때 사용됩니다. 따라서 Python 인터프리터가 일치하는 항목을 찾으면 except 블록에 작성된 코드가 실행됩니다.
아래의 예제 Python 코드를 살펴 보겠습니다.
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex)
여기서 발생할 수있는 두 가지 예외가 있습니다. ZeroDivisionError 과 IndexError . 이러한 예외가 발생하면 except 블록이 실행됩니다.
위 코드에서 idx = 3이므로 idx_ 값 0이되고 값 / idx_ 값 ZeroDivisionError가 발생합니다.
# 2) 여러 예외로 여러 예외 처리
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
각 예외를 개별적으로 처리하고 싶다면 이것이 가능합니다.
아래의 예제 Python 코드를 고려하십시오.
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex
여기서는 마지막 except 문에서 Exception이 사용되었음을 알 수 있습니다. 이는 예외 개체 Exception이 모든 예외와 일치하기 때문입니다. 이런 이유로 파이썬은 하나가 일치하면 다른 예외 핸들러 검사를 중지하므로 항상 마지막이어야합니다.
위의 코드에서 idx = 5 , 그 후 arr (idx) 올릴 것이다 IndexError 때문에 idx 목록의 길이보다 큽니다. arr
또한 응용 프로그램에서 발생한 예외가 확실하지 않아 계속 실행해도 안전하지 않습니다. 그렇기 때문에 예기치 않은 예외를 포착하는 Exception 유형이 있습니다. 그런 다음 사용자에게 알리고 동일한 예외를 발생시켜 애플리케이션을 중단합니다.
Else 문 시도
이것은 선택적 기능 예외 처리와 관련하여 오류가 발생하지 않았을 때 실행할 코드를 추가 할 수 있습니다. 오류가 발생하면이 else-block이 실행되지 않습니다.
아래 예제 Python 코드를 고려하고 편집기를 열고 코드를 elseTry.py로 저장하십시오.
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break
사용자로부터 입력을 받아 1을 나누는 데 사용합니다. 여기에는 두 가지 예외가 있습니다. 잘못된 사용자 입력으로 인해 ValueError 그리고 제로 (0) 원인이 될 ZeroDivisionError . except 문은 이러한 오류를 처리합니다.
이제 우리는 값 . else- 블록은 try 블록이 오류없이 실행되는 경우에만 인쇄되도록합니다. 이것은 try-block에서 오류가 발생하면 값 정의되지 않습니다. 따라서 액세스하면 또 다른 오류가 발생합니다.
Python elseTry.py로 위 코드 실행
위의 출력은 첫 번째 입력에 대해 다음을 입력했음을 보여줍니다. 0 ENTER를 누르십시오. 우리의 제수가 0을 받았으므로 1 / 제수를 올렸습니다. zeroDivisionError . 두 번째 입력은 k로 유효하지 않습니다. int (), 따라서 예외 ValueError 제기됩니다.
데이터웨어 하우스의 메타 데이터 란?
그러나 마지막 입력은 유효한 9 였고 결과적으로 ' 값 '0.1111111111111111로 인쇄 됨
마지막 진술 시도
이것은 또한 선택적 기능 예외 처리와 예외 처리기에서 어떤 일이 발생하더라도 항상 실행됩니다.
그건:
- 예외 발생 여부
- 다른 블록에서 '리턴'이 호출 되더라도.
- 스크립트가 다른 블록에서 종료 된 경우에도
따라서 모든 상황에서 실행하려는 코드가 있다면 finally-block이 우리의 역할입니다. 이 블록은 주로 파일 닫기와 같은 정리에 사용됩니다.
아래의 예제 Python 코드를 고려하십시오.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
이 코드는 현재 디렉토리에서 text.txt 파일을 열고 읽으려고합니다. 파일이 있으면 프로그램이 파일의 첫 번째 줄을 인쇄하고 finally-block이 실행되고 파일을 닫습니다.
이 프로그램 파일이 있고 Hello를 포함하는 디렉토리에 text.txt라는 파일이 있다고 가정합니다. 프로그램을 실행하면 출력이
이 예제는 finally- 블록에서 파일을 닫을 때 발생할 수있는 작은 문제를 해결하기를 원했기 때문에 의도적으로 선택되었습니다.
파일이 없으면 예외 FileNotFoundError 발생하고 변수 openFile 정의되지 않으며 파일 객체가 아닙니다. 따라서 finally- 블록에서 닫으려고하면 예외가 발생합니다. UnboundLocalError 하위 클래스입니다 NameError .
이것은 기본적으로 우리가 변수를 참조하려고한다는 것을 말합니다. openFile 할당되기 전에.
여기서 작은 트릭은 finally- 블록 내부에서 예외 처리기를 사용하는 것입니다.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
try-block이 FileNotFoundError를 발생 시키면 다음과 같은 출력이 나타납니다.
예외 발생
Python 예외에 대한 한 가지 좋은 소식은 의도적으로 예외를 제기 할 수 있다는 것입니다. 예외는 성명을 올리다 .
raise 문에는 다음 구문이 있습니다.
raise (ExceptionName((*args: Object)))
터미널을 열고 예외 개체를 Python 내장 예외. 예를 들면 ZeroDivisionError를 발생 시키면 :
>>> raise ZeroDivisionError('Can't divide by zero')
우리는 추적을 얻을 것입니다 :
그렇다면 예외를 발생시키는 것이 왜 중요한가요?
- 사용자 지정 예외로 작업 할 때.
- 온 전성 검사 중.
사용자 지정 예외 클래스
사용자 지정 예외는 사용자의 필요에 맞는 오류를 처리하기 위해 생성하는 예외입니다. 트릭은 객체에서 파생되는 클래스를 정의한다는 것입니다. 예외 그런 다음 raise 문을 사용하여 예외 클래스를 발생시킵니다.
사용자 입력을 확인하고 입력 값이 음수가 아닌지 확인 (건전성 확인)한다고 가정합니다. 물론 Python 예외 ValueError를 발생시킬 수 있지만 다음과 같이 구체적이고 자명 한 이름을 지정하여 오류를 사용자 정의하고 싶습니다. InputIsNegativeError . 그러나이 예외는 Python 내장 예외가 아닙니다.
따라서 먼저 Exception에서 파생되는 기본 클래스를 만듭니다.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
그런 다음 기본 클래스를 상속하고 특정 오류를 처리 할 예외 클래스를 만듭니다.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
이걸 테스트 해보자
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
위의 코드는 사용자 입력을 요청하고 음수인지 확인합니다. 참이면 나중에 except- 문에서 잡히는 커스텀 예외 InputIsNegativeError를 발생시킵니다.
다음은 전체 코드입니다.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
입력 값이 -1과 같은 음수이면 다음과 같이 출력됩니다.
확인 Python 문서 Python 사용자 지정 예외에 대한 자세한 내용은
자주 묻는 질문
Q # 1) 파이썬은 예외를 어떻게 처리합니까?
대답: Python은 다음을 사용하여 예외를 처리합니다. try-except 문 . 예외를 발생시킬 수있는 코드는 시도 블록 동안 블록 제외 예외가 발생하는 경우 처리 할 코드를 보유합니다.
Q # 2) 파이썬에서 예외가 발생하는 것은 무엇입니까?
대답: Python 인터프리터가 잘못된 코드를 발견 할 때마다 예외가 발생합니다. 이는 예기치 않은 일이 발생했음을 알려주는 Python 고유의 방법입니다. 의도적으로 예외를 발생시킬 수도 있습니다. 성명을 올리다 .
Q # 3) 파이썬은 여러 예외를 어떻게 처리합니까?
대답: Python은 단일 except 블록 또는 여러 except 블록을 사용하여 여러 예외를 처리합니다.
단일 블록의 경우 예외는 튜플로 전달됩니다. 외 (Exception1, Exception2, .., ExceptionN) 및 Python은 오른쪽에서 왼쪽으로 일치하는지 확인합니다. 이 경우 각 예외에 대해 동일한 조치가 취해집니다.
모든 예외를 포착하는 또 다른 방법은 except 키워드 뒤에 예외 이름을 생략하는 것입니다.
except: # handle all exceptions here
두 번째 방법은 각 예외에 대해 except 블록을 사용하는 것입니다.
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
이렇게하면 각 예외에 대해 별도의 조치를 취할 수 있습니다.
Q # 4) 파이썬에서 예외 처리가 중요한 이유는 무엇입니까?
대답: Python에서 예외 처리의 이점은 강력하고 깨끗하며 오류가없는 애플리케이션을 만들 수 있다는 것입니다. 일부 오류로 인해 프로덕션 코드가 중단되는 것을 원하지 않으므로 오류를 처리하고 애플리케이션을 계속 실행합니다.
Q # 5) 파이썬에서 예외를 어떻게 무시합니까?
대답: Python에서 예외를 무시하려면 통과하다 except 블록의 키워드. ValueError 예외를 무시하고 싶다고 가정 해 보겠습니다. 우리는 이렇게 할 것입니다 :
except ValueError: pass
수행중인 작업을 알지 못하는 경우 예외를 무시하는 것은 좋지 않습니다. 최소한 모든 잠재적 오류에 대해 사용자에게 알립니다.
결론
이 튜토리얼에서 우리는 다음을 다뤘습니다 : Python Exceptions, Traceback; 예외를 처리하는 방법 시험 / 외 / 그밖에 / 드디어 블록, 방법 올리다 예외 및 마지막으로 자체 사용자 지정 예외를 만드는 방법.
읽어 주셔서 감사합니다!