오늘.ssam)
드디어 예외처리 까지 오게 되었습니다. 마지막 까지 화이팅입니다.
Q1.나)
파이썬에서 예외 처리의 개념과 사용법 에 코드예시로 알려주세요

A1.ssam)
파이썬에서 예외 처리는 프로그램 실행 중 발생할 수 있는 예기치 않은 오류나 예외를 처리하는 방법입니다. 이를 위해 try
, except
, finally
및 else
키워드를 사용합니다.
예외 처리를 사용하면 프로그램이 오류로 인해 중단되지 않고, 예외를 처리한 후 계속 실행됩니다. 이것은 프로그램이 안정적이고 견고하게 만드는데 도움이 됩니다.
예외 처리의 기본 구조는 다음과 같습니다.
try:
# 예외가 발생할 가능성이 있는 코드
except ExceptionType: # 예외 처리를 원하는 예외 유형
# 예외 발생 시 실행할 코드
else:
# 예외가 발생하지 않을 때 실행할 코드 (선택적)
finally:
# 예외 발생 여부와 상관없이 항상 실행할 코드 (선택적)
간단한 예시를 들어보겠습니다.
def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
else:
print("결과:", result)
finally:
print("나눗셈 연산이 완료되었습니다.")
divide(10, 2) # 정상적인 경우
divide(10, 0) # 0으로 나누는 경우 (예외 발생)
위 예시에서 divide
함수는 두 숫자를 나누고 그 결과를 출력합니다. try
블록에서 0으로 나누는 예외가 발생할 수 있으므로, 이를 except ZeroDivisionError
로 처리합니다. 예외가 발생하지 않으면 else
블록이 실행되고, 예외 발생 여부와 상관없이 finally
블록이 항상 실행됩니다.
Q2.나)
예외 유형은 어던것들이 있나요?
A2.ssam)
파이썬에서는 다양한 예외 유형이 존재합니다. 여기 몇 가지 기본적인 예외 유형들을 소개하겠습니다:
BaseException
: 모든 예외의 기본 클래스입니다. 일반적으로 직접 사용되지 않습니다.Exception
: 사용자 정의 예외를 포함한 모든 내장 예외의 기본 클래스입니다.ArithmeticError
: 수학 연산 관련 예외의 기본 클래스입니다.OverflowError
: 수치 연산 결과가 너무 큰 경우 발생합니다.ZeroDivisionError
: 0으로 나누려고 할 때 발생합니다.
LookupError
: 시퀀스와 관련된 예외의 기본 클래스입니다.IndexError
: 시퀀스에서 범위를 벗어난 인덱스를 사용할 때 발생합니다.KeyError
: 딕셔너리에서 존재하지 않는 키를 사용할 때 발생합니다.
AttributeError
: 객체에 존재하지 않는 속성이나 메소드를 사용하려고 할 때 발생합니다.NameError
: 로컬 또는 전역 이름을 찾을 수 없을 때 발생합니다.TypeError
: 잘못된 자료형이나 인자가 사용될 때 발생합니다.ValueError
: 올바른 자료형이지만 잘못된 값이 사용될 때 발생합니다.FileNotFoundError
: 요청한 파일이나 경로를 찾을 수 없을 때 발생합니다.IOError
: 입출력 연산 중 오류가 발생한 경우입니다.FileExistsError
: 이미 존재하는 파일이나 디렉토리를 생성하려고 할 때 발생합니다.PermissionError
: 권한 없이 파일이나 디렉토리에 접근하려고 할 때 발생합니다.
이 외에도 다양한 예외 유형이 있습니다. 필요에 따라 사용자 정의 예외를 만들 수도 있습니다. 이러한 예외들을 사용하여 프로그램에서 발생할 수 있는 다양한 오류 상황을 처리할 수 있습니다.
Q3.나)
사용자 정의 예외란 무엇이고 어떻게 사용하나요?
A3.ssam)
사용자 정의 예외란 프로그래머가 직접 정의한 예외 클래스로, 파이썬에서 제공하는 기본 예외 클래스 외에 프로그램의 특정 조건이나 요구 사항에 맞게 예외를 처리하려는 경우 사용됩니다. 사용자 정의 예외를 만들기 위해서는 Exception
클래스 또는 그 하위 클래스를 상속받아야 합니다.
사용자 정의 예외를 만들고 사용하는 방법은 다음과 같습니다:
1) Exception
클래스를 상속받아 새로운 예외 클래스를 정의합니다.
class CustomException(Exception):
pass
2) 필요한 경우, 예외 클래스에 추가적인 메소드나 속성을 정의할 수 있습니다.
class CustomException(Exception):
def __init__(self, message, value):
super().__init__(message)
self.value = value
3) 사용자 정의 예외를 발생시키거나 처리하기 위해 raise
와 try-except
구문을 사용합니다.
def check_value(value):
if value < 0:
raise CustomException("음수는 허용되지 않습니다.", value)
try:
check_value(-1)
except CustomException as e:
print(f"{e}: {e.value}")
위 예시에서 CustomException
이라는 사용자 정의 예외를 만들고, check_value
함수에서 값이 음수인 경우 해당 예외를 발생시킵니다. try-except
블록을 사용하여 발생한 사용자 정의 예외를 처리하고, 예외 메시지와 값을 출력합니다.
Q4.나)
예외처리 사례를 예시를 설명해주세요.
A4.ssam)
다양한 예외를 처리하는 예제를 살펴보겠습니다. 다음 코드는 사용자가 입력한 숫자로 리스트를 인덱싱하고, 결과 값을 제곱하여 반환하는 함수를 작성한 것입니다. 이 함수는 여러 예외 유형을 처리할 수 있습니다.
def get_square(numbers, index):
try:
result = numbers[index] ** 2
except IndexError:
print("인덱스가 리스트의 범위를 벗어났습니다.")
except TypeError:
print("인덱스는 정수여야 합니다.")
except Exception as e:
print(f"알 수 없는 예외가 발생했습니다: {e}")
else:
return result
finally:
print("get_square 함수 실행 완료")
numbers = [1, 2, 3, 4, 5]
# 정상적인 경우
print(get_square(numbers, 2))
# 인덱스가 리스트의 범위를 벗어난 경우
print(get_square(numbers, 10))
# 인덱스가 정수가 아닌 경우
print(get_square(numbers, 'two'))
# 정의되지 않은 예외를 발생시키는 경우
try:
print(get_square(numbers, {'key': 'value'}))
except Exception as e:
print(f"외부에서 처리된 예외: {e}")
위 예제에서는 get_square
함수를 호출할 때 발생할 수 있는 다양한 예외 유형을 처리합니다:
IndexError
: 인덱스가 리스트의 범위를 벗어난 경우TypeError
: 인덱스가 정수가 아닌 경우 (예: 문자열이나 딕셔너리)Exception
: 그 외의 예외 유형 (알 수 없는 예외)
함수 내부에서 발생한 예외는 try-except
블록을 사용하여 처리하며, else
절에서 결과 값을 반환합니다. 또한, finally
절을 사용하여 함수 실행 완료 메시지를 출력합니다.
마지막 호출에서는 get_square
함수가 정의되지 않은 예외를 처리하지 못하므로, 호출 코드에서 추가로 try-except
블록을 사용하여 외부에서 예외를 처리합니다. 이렇게 하면, 함수 내부에서 처리할 수 없는 예외를 외부에서 처리할 수 있습니다.
Q5.나)
추가적으로 예외처리에서 꼭 알아야 할 내용들이 있다면 설명해주세요.
A5.ssam)
예외 처리에서 추가로 알아두면 좋은 내용들은 다음과 같습니다.
1) 다중 예외 처리: except
절에서 여러 예외 유형을 동시에 처리할 수 있습니다. 이를 위해 괄호 안에 쉼표로 구분된 예외 유형들을 지정하면 됩니다.
try:
# 예외가 발생할 수 있는 코드
except (ExceptionType1, ExceptionType2):
# 여러 예외 유형에 대해 실행할 코드
2) 예외 연쇄: 예외가 다른 예외에 의해 발생한 경우, raise
문에서 from
키워드를 사용하여 원래 예외와 함께 새로운 예외를 발생시킬 수 있습니다. 이를 통해 두 예외 사이의 관계를 명확하게 표현할 수 있습니다.
try:
# 예외가 발생할 수 있는 코드
except ExceptionType1 as e1:
raise ExceptionType2("새로운 예외 메시지") from e1
3) 조건부 예외 발생: raise
문을 사용하여 특정 조건이 충족되면 예외를 발생시킬 수 있습니다.
if condition:
raise CustomException("조건이 충족되어 예외가 발생했습니다.")
4) 예외를 묵시적으로 처리: 경우에 따라서는 pass
문을 사용하여 예외를 묵시적으로 처리할 수 있습니다. 이 방법은 예외를 완전히 무시하는 것이므로, 실제로 문제가 없는 경우에만 사용해야 합니다.
try:
# 예외가 발생할 수 있는 코드
except ExceptionType:
pass # 예외를 무시하고 코드 실행을 계속
5) assert
문: assert
문을 사용하여 특정 조건이 충족되지 않으면 AssertionError
예외를 발생시킬 수 있습니다. 이 방법은 주로 디버깅 목적으로 사용되며, 조건이 참이 아닌 경우 프로그램이 오류를 포함하고 있음을 가정합니다.
assert condition, "AssertionError 발생 시 출력할 메시지"
예외 처리를 올바르게 사용하면 프로그램의 안정성과 견고성을 높일 수 있습니다. 따라서 예외 처리를 프로그래밍 과정에서 적절하게 활용하는 것이 중요합니다.
Q6.나)
예외 연쇄에 대해서 자세히 알려주세요. 코드를 통해서 설명바랍니다.
A6.ssam)
예외 연쇄는 한 예외가 다른 예외에 의해 발생한 경우에 사용됩니다. 이를 통해 발생한 예외와 관련된 원래 예외를 함께 전달할 수 있습니다. 이는 디버깅에 도움이 되며, 프로그램에서 예외 발생의 원인을 더 명확하게 추적할 수 있게 합니다.
예외 연쇄를 구현하려면, raise
문에서 from
키워드를 사용하여 새로운 예외를 발생시키고 원래 예외를 함께 전달합니다. 아래 예제에서는 divide
함수에서 발생한 ZeroDivisionError
예외를 연쇄적으로 처리합니다.
class CustomZeroDivisionError(Exception):
def __init__(self, message, original_exception):
super().__init__(message)
self.original_exception = original_exception
def divide(a, b):
try:
result = a / b
except ZeroDivisionError as e:
raise CustomZeroDivisionError("0으로 나눌 수 없습니다.", e) from e
return result
try:
print(divide(10, 0))
except CustomZeroDivisionError as e:
print(f"사용자 정의 예외: {e}")
print(f"원래 예외: {e.original_exception}")
위 예제에서 divide
함수에서 ZeroDivisionError
가 발생하면, CustomZeroDivisionError
예외를 발생시키고 원래 예외를 전달합니다. 이렇게 하면 try-except
블록에서 사용자 정의 예외와 원래 예외를 모두 알 수 있으며, 이를 활용하여 프로그램에서 예외 발생의 원인을 분석할 수 있습니다.
예외 연쇄를 사용하면 프로그램의 예외 처리를 보다 세밀하게 관리할 수 있으며, 예외 발생의 원인과 관련된 정보를 더 잘 전달할 수 있습니다. 이는 프로그램의 안정성과 견고성을 높이는데 도움이 됩니다.
하지만 프로그래램을 처음 배우는 입장에서 굳이 이렇게 가지 해야 하는 생각할수 있습니다. 맞습니다. 지금 이렇게 까지 할 필요없습니다. 그냥 이런게 있다는 정도만 기억하시면 됩니다.
Last.ssam)
모두 고생하셨습니다. 우리는 기초적인 내용이지만 거대한 바위를 한번 굴렸습니다. 다음 한바퀴는 지금보다 더 쉬울 것입니다. 그것은 분명합니다.
이제 할 일은 기초내용 공부한 것을 단단하게 다지는 것입니다. 다음장 부터는 지금 까지 배운내용들을 기초로 연습문제를 풀어보는 파트입니다. 모두 다음에 또 봐요~~^^
- Q1) 파이썬에서 예외 처리의 개념과 사용법 에 코드예시로 알려주세요
- Q2) 예외 유형은 어던것들이 있나요?
- Q3) 사용자 정의 예외란 무엇이고 어떻게 사용하나요?
- Q4) 예외처리 사례를 예시를 설명해주세요.
- Q5) 추가적으로 예외처리에서 꼭 알아야 할 내용들이 있다면 설명해주세요.
- Q6) 예외 연쇄에 대해서 자세히 알려주세요. 코드를 통해서 설명바랍니다.
지금보면 아쉬 쉬울것 같은 포스트들!!
[파이썬] 1-1.Hello, World! 출력하기 [입문,초보용 문법] - 질문으로 공부하기
시작 나 ) Hello, World! 출력하기 코드 작성 ssam) 파이썬에서는 아래와 같이 print() 함수를 사용하여 화면에 출력할 수 있습니다. print("Hello, World!") 위 코드를 실행하면 아래 처럼 "Hello, World!"라는 문
it-plus.tistory.com
[파이썬] 1-2. 변수와 자료형 [입문,초보용 문법] - 질문으로 공부하기
Q1.나) 이번에는 변수와 자료형에 대해서 알려주세요 A1.ssam) 좋습니다! 변수와 자료형을 설명하고, 예제 코드를 통해 실습해보겠습니다. 1. 변수 변수는 데이터를 저장하는 그릇입니다. 파이썬에
it-plus.tistory.com
[파이썬] 1-3. 연산자(산술,비교,논리,할당,비트) [입문,초보용 문법] - 질문으로 공부하기
Q1.나) 연산자에 대해서 설명해주세요 A1.ssam) 파이썬에서는 다양한 연산자를 제공합니다. 연산자는 특정한 작업을 수행하거나 값을 비교할 때 사용됩니다. 아래는 파이썬에서 제공하는 연산자의
it-plus.tistory.com
'프로그래밍 > 파이썬 Python' 카테고리의 다른 글
[파이썬 문법] 8. 파일입출력 기초 총정리(3단계 작업,9종류파일 기본입출력) (0) | 2023.04.13 |
---|---|
[파이썬 문법] 7-3. 라이브러리(Library) 개념과 사용법(자주 사용되는 라이브러리 리스트) (0) | 2023.04.13 |
[파이썬 문법] 7-2. 패키지(Package) 개념과 사용법- 질문으로 공부하기 (0) | 2023.04.13 |
[파이썬 문법] 7-1. 모듈(Module)사용법과 경로지정2가지 - 질문으로 공부하기 (0) | 2023.04.12 |
[파이썬 문법] 7. 모듈vs패키지vs라이브러리(개념정리) - 질문으로 공부하기 (0) | 2023.04.12 |
[파이썬 문법] 6. 클래스(class) 기초개념[클래스의 일생] - 질문으로 공부하기 (0) | 2023.04.09 |
[파이썬 문법] print함수 절친 f 스트링 사용법 [참고2] - 5분 완성 (0) | 2023.04.07 |
[파이썬 문법] 5-2-집합 자료형 총정리 - 질문으로 공부하기 (0) | 2023.04.06 |
댓글