Python 예외 처리

Python 예외 처리

지금까지 Set 1부터 4까지 기본적인 Python을 살펴보았습니다. 세트 1 | 세트 2 | 세트 3 | 세트 4 ).

이 기사에서는 적절한 예를 통해 Python에서 try, Except 및 finally 문을 사용하여 예외를 처리하는 방법에 대해 설명합니다.

Python의 오류는 두 가지 유형이 될 수 있습니다. 구문 오류 및 예외 . 오류는 프로그램 실행을 중지시키는 프로그램의 문제입니다. 반면, 프로그램의 정상적인 흐름을 변경하는 일부 내부 이벤트가 발생하면 예외가 발생합니다.

Python의 다양한 예외 유형:

Python에는 프로그램 실행 중에 오류가 발생할 때 발생할 수 있는 몇 가지 내장 Python 예외가 있습니다. 다음은 Python에서 가장 일반적인 예외 유형 중 일부입니다.

  • 구문오류: 이 예외는 인터프리터가 코드에서 철자가 틀린 키워드, 콜론 누락 또는 불균형 괄호와 같은 구문 오류를 발견할 때 발생합니다.
  • 유형오류 : 이 예외는 정수에 문자열을 추가하는 것과 같이 잘못된 유형의 객체에 연산이나 함수가 적용될 때 발생합니다.
  • 이름오류 : 이 예외는 현재 범위에서 변수나 함수 이름을 찾을 수 없을 때 발생합니다.
  • 색인 오류 : 이 예외는 인덱스가 목록, 튜플 또는 기타 시퀀스 유형의 범위를 벗어날 때 발생합니다.
  • 키 오류 : 이 예외는 사전에서 키를 찾을 수 없을 때 발생합니다.
  • 값오류 : 이 예외는 문자열이 유효한 정수를 나타내지 않을 때 문자열을 정수로 변환하려고 시도하는 등 잘못된 인수나 입력으로 함수나 메서드를 호출할 때 발생합니다.
  • 속성오류 : 이 예외는 클래스 인스턴스의 존재하지 않는 속성에 액세스하려고 시도하는 등 객체에서 속성이나 메서드를 찾을 수 없을 때 발생합니다.
  • IO오류 : 입출력 오류로 인해 파일 읽기, 쓰기 등의 I/O 작업이 실패할 때 발생하는 예외입니다.
  • ZeroDivisionError : 이 예외는 숫자를 0으로 나누려고 할 때 발생합니다.
  • 가져오기 오류 : import 문이 모듈을 찾거나 로드하지 못할 때 이 예외가 발생합니다.

이는 Python에서 발생할 수 있는 다양한 유형의 예외 중 몇 가지 예일 뿐입니다. 오류를 정상적으로 처리하고 프로그램 충돌을 방지하려면 try-Exception 블록이나 기타 오류 처리 기술을 사용하여 코드에서 예외를 적절하게 처리하는 것이 중요합니다.

구문 오류와 예외의 차이점

구문 오류: 이름에서 알 수 있듯이 이 오류는 코드의 잘못된 구문으로 인해 발생합니다. 프로그램 종료로 이어집니다.

예:

코드에 구문 오류가 있습니다. 그만큼 ' if'> 명령문 뒤에는 콜론( :> ), 그리고 ' print'> 문은 안쪽으로 들여쓰기되어야 합니다. ' if'> 차단하다.

파이썬3




amount> => 10000> if> (amount>> 2999> )> print> (> 'You are eligible to purchase Dsa Self Paced'> )>

산출:

예외: 프로그램의 구문은 올바르지만 코드에서 오류가 발생하면 예외가 발생합니다. 이 오류로 인해 프로그램 실행이 중단되지는 않지만 프로그램의 정상적인 흐름이 변경됩니다.

예:

여기 이 코드에서 우리는 '점수' 0으로 설정하면 다음과 같은 오류가 발생합니다. 'ZeroDivisionError'

파이썬3




marks> => 10000> a> => marks> /> 0> print> (a)>

산출:

위의 예에서는 숫자를 0으로 나누려고 할 때 ZeroDivisionError가 발생했습니다.

메모: Exception은 Python의 모든 예외에 대한 기본 클래스입니다. 예외 계층 구조를 확인할 수 있습니다. 여기 .

예:

1) TypeError: 이 예외는 잘못된 유형의 객체에 작업이나 함수가 적용될 때 발생합니다. 예는 다음과 같습니다.
여기에 '유형 오류' 추가되는 두 데이터 유형이 모두 다르기 때문에 발생합니다.

파이썬3




x> => 5> y> => 'hello'> z> => x> +> y>

output:  Traceback (most recent call last):  File '7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py', line 4, in   z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str' 

문제를 해결하려면 catch 블록을 시도하십시오.

코드는 정수( ' x'> ) 및 문자열( ' y'> )을 함께 사용하는 것은 유효한 작업이 아니며 ' TypeError'> . 코드는 ' try'> 그리고 ' except'> 이 예외를 포착하고 오류 메시지를 인쇄하려면 블록을 차단하세요.

파이썬3




x> => 5> y> => 'hello'> try> :> > z> => x> +> y> except> TypeError:> > print> (> 'Error: cannot add an int and a str'> )>

산출

Error: cannot add an int and a str 

Try 및 Except 문 – 예외 잡기

Try 및 Except 문은 Python에서 예외를 포착하고 처리하는 데 사용됩니다. 예외를 발생시킬 수 있는 문은 try 절 안에 보관되고, 예외를 처리하는 문은 Except 절 안에 작성됩니다.

예: 여기서는 인덱스가 범위를 벗어난 배열 요소에 액세스하고 해당 예외를 처리하려고 합니다.

파이썬3




a> => [> 1> ,> 2> ,> 3> ]> try> :> > print> (> 'Second element = %d'> %> (a[> 1> ]))> > print> (> 'Fourth element = %d'> %> (a[> 3> ]))> except> :> > print> (> 'An error occurred'> )>

산출

Second element = 2 An error occurred 

위의 예에서 오류를 일으킬 수 있는 문은 try 문(이 경우 두 번째 print 문) 내에 배치됩니다. 두 번째 print 문은 목록에 없는 네 번째 요소에 액세스하려고 시도하며 이로 인해 예외가 발생합니다. 그런 다음 이 예외는 Except 문에 의해 포착됩니다.

특정 예외 잡기

try 문에는 서로 다른 예외에 대한 처리기를 지정하기 위해 둘 이상의 Except 절이 있을 수 있습니다. 최대 하나의 핸들러가 실행된다는 점에 유의하세요. 예를 들어 위 코드에 IndexError를 추가할 수 있습니다. 특정 예외를 추가하는 일반적인 구문은 다음과 같습니다.

try:  # statement(s) except IndexError:  # statement(s) except ValueError:  # statement(s) 

예: Python에서 특정 예외 잡기

코드는 함수를 정의합니다 ' fun(a)'> 계산하는 것 b> 입력을 기반으로 a> . 만약에 a> 4보다 작으면 0으로 나누기를 시도하여 다음이 발생합니다. ' ZeroDivisionError'> . 코드 호출 fun(3)> 그리고 fun(5)> try-제외 블록 내부. 이는 다음을 처리합니다. ZeroDivisionError> ~을 위한 fun(3)> 그리고 인쇄 ZeroDivisionError가 발생하여 처리되었습니다. 그만큼 ' NameError'> 블록이 없기 때문에 블록이 실행되지 않습니다. ' NameError'> 코드의 예외.

파이썬3




def> fun(a):> > if> a <> 4> :> > b> => a> /> (a> -> 3> )> > print> (> 'Value of b = '> , b)> > try> :> > fun(> 3> )> > fun(> 5> )> except> ZeroDivisionError:> > print> (> 'ZeroDivisionError Occurred and Handled'> )> except> NameError:> > print> (> 'NameError Occurred and Handled'> )>

산출

ZeroDivisionError Occurred and Handled 

fun(3) 행에 주석을 달면 출력은 다음과 같습니다.

NameError Occurred and Handled 

위의 출력은 Python이 b 값에 ​​액세스하려고 시도하자마자 NameError가 발생하기 때문에 그렇습니다.

Else 절을 ​​사용해 보세요

Python에서는 모든 Except 절 뒤에 있어야 하는 try-Exception 블록에서 else 절을 ​​사용할 수도 있습니다. 코드는 try 절에서 예외가 발생하지 않는 경우에만 else 블록에 들어갑니다.

else 절을 ​​사용해 보세요

코드는 함수를 정의합니다 AbyB(a, b)> 계산하는 것 c> ((a+b) / (a-b))와 같이 전위를 처리합니다. ZeroDivisionError> . 0으로 나누기 오류가 없으면 결과를 인쇄합니다. 부름 AbyB(2.0, 3.0)> 계산하고 인쇄합니다 -5.0> , 통화 중 AbyB(3.0, 3.0)> 0으로 나누려고 시도하여 결과가 발생합니다. ZeroDivisionError> , 잡힌 것과 a/b 결과는 0입니다. 인쇄됩니다.

파이썬3




def> AbyB(a , b):> > try> :> > c> => ((a> +> b)> /> (a> -> b))> > except> ZeroDivisionError:> > print> (> 'a/b result in 0'> )> > else> :> > print> (c)> AbyB(> 2.0> ,> 3.0> )> AbyB(> 3.0> ,> 3.0> )>

산출:

-5.0 a/b result in 0 

마지막으로 Python의 키워드

Python은 키워드를 제공합니다 마지막으로 , 항상 try 및 Except 블록 다음에 실행됩니다. 마지막 블록은 항상 try 블록이 정상적으로 종료된 후 또는 일부 예외로 인해 try 블록이 종료된 후에 실행됩니다.

통사론:

try:  # Some Code....   except:  # optional block  # Handling of exception (if required)  else:  # execute if no exception  finally:  # Some code .....(always executed) 

예:

코드는 0으로 정수 나누기를 수행하려고 시도하며 그 결과 ZeroDivisionError> . 예외를 포착하고 인쇄합니다. 0으로 나눌 수 없습니다. 예외사항에 관계없이, finally> 블록이 실행되고 인쇄됩니다. 이는 항상 실행됩니다.

파이썬3




try> :> > k> => 5> /> /> 0> > print> (k)> except> ZeroDivisionError:> > print> (> 'Can't divide by zero'> )> finally> :> > print> (> 'This is always executed'> )>

산출:

Can't divide by zero This is always executed 

예외 발생

그만큼 성명서를 올리다 프로그래머가 특정 예외가 발생하도록 강제할 수 있습니다. raise의 유일한 인수는 발생할 예외를 나타냅니다. 이는 예외 인스턴스이거나 예외 클래스(Exception에서 파생되는 클래스)여야 합니다.

이 코드는 의도적으로 NameError> 메시지와 함께 안녕하세요 사용하여 raise> 내의 진술 try> 차단하다. 그런 다음, NameError> 예외, 인쇄 예외, 다음을 사용하여 동일한 예외를 다시 발생시킵니다. raise> . 이는 Python에서 예외가 발생하고 처리되어 사용자 정의 오류 메시지와 추가 예외 전파가 허용되는 방법을 보여줍니다.

파이썬3




try> :> > raise> NameError(> 'Hi there'> )> except> NameError:> > print> (> 'An exception'> )> > raise>

위 코드의 출력은 단순히 예외로 한 줄 인쇄되지만 마지막 줄의 raise 문으로 인해 마지막 줄에서도 런타임 오류가 발생합니다. 따라서 명령줄의 출력은 다음과 같습니다.

Traceback (most recent call last):  File '/home/d6ec14ca595b97bff8d8034bbf212a9f.py', line 5, in   raise NameError('Hi there') # Raise Error NameError: Hi there 

예외 처리의 장점:

  • 프로그램 신뢰성 향상 : 예외를 적절하게 처리하면 예상치 못한 오류나 입력으로 인해 프로그램이 충돌하거나 잘못된 결과가 나오는 것을 방지할 수 있습니다.
  • 단순화된 오류 처리 : 예외 처리를 사용하면 오류 처리 코드를 기본 프로그램 논리에서 분리하여 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.
  • 클리너 코드: 예외 처리를 사용하면 오류를 확인하기 위해 복잡한 조건문을 사용하지 않아도 되므로 코드가 더 깔끔하고 읽기 쉬워집니다.
  • 더 쉬운 디버깅 : 예외가 발생하면 Python 인터프리터는 예외가 발생한 정확한 위치를 보여주는 역추적을 인쇄하므로 코드를 더 쉽게 디버그할 수 있습니다.

예외 처리의 단점:

  • 성능 오버헤드: 예외 처리는 조건문을 사용하여 오류를 확인하는 것보다 느릴 수 있습니다. 왜냐하면 인터프리터가 예외를 포착하고 처리하기 위해 추가 작업을 수행해야 하기 때문입니다.
  • 코드 복잡성 증가 : 예외 처리는 특히 여러 유형의 예외를 처리하거나 복잡한 오류 처리 논리를 구현해야 하는 경우 코드를 더 복잡하게 만들 수 있습니다.
  • 가능한 보안 위험: 부적절하게 처리된 예외는 잠재적으로 민감한 정보를 공개하거나 코드에 보안 취약점을 만들 수 있으므로 예외를 신중하게 처리하고 프로그램에 대한 정보가 너무 많이 노출되지 않도록 하는 것이 중요합니다.

전반적으로 Python에서 예외 처리의 이점은 단점보다 큽니다. 그러나 코드 품질과 프로그램 안정성을 유지하려면 이를 신중하고 신중하게 사용하는 것이 중요합니다.

이 기사는 Nikhil Kumar Singh(nickzuck_007)이 기고한 것입니다.