Python - 내장 예외
안녕하세요, 자신을 더욱 성장시키고자 하는 프로그래머 여러분! 오늘은 Python의 내장 예외에 대해 탐험해보겠습니다. 프로그래밍에 새로운 사람이라도 걱정하지 마세요; 저는 수년 동안 수많은 학생들을 가르쳐왔던 것처럼, 단계별로 이 주제를 안내해드리겠습니다. 함께 이 흥미로운 여정에 떠나보세요!
Python의 표준 내장 예외
厨房에서 요리를 하다가 갑자기 필수 재료가 없다는 것을 깨닫는 것과 같습니다. 이는 프로그래밍에서 예외가 발생하는 것과 유사합니다 - 코드의 정상적인 흐름을 방해하는 예상치 못한 일이 발생합니다. Python은 다양한 종류의 오류를 처리하기 위해 여러 가지 내장 예외를 제공합니다.
일부 가장 일반적인 내장 예외를 살펴보겠습니다:
- SyntaxError: 문장 끝에 마침표를 빼먹는 것과 같은 문제입니다. Python은 잘못된 문법을 발견하면 이 오류를 일으킵니다.
print "Hello, World!" # SyntaxError: 'print' 호출에 괄호가 빠졌습니다
이 예제에서는 Python 3에서 필요한 print 함수의 문자열에 괄호를 추가하지 않았습니다.
- NameError: 아직 정의되지 않은 변수를 사용하려고 시도할 때 발생합니다.
print(x) # NameError: 'x'라는 이름이 정의되지 않았습니다
여기서는 값이 할당되지 않은 'x' 변수를 인쇄하려고 시도하고 있습니다.
- TypeError: 잘못된 형식에 연산을 수행할 때 발생합니다.
"2" + 2 # TypeError: 문자열(str)에만 연결할 수 있습니다 (int가 아닙니다)
이 경우, 문자열("2")와 정수(2)를 추가하려고 시도하고 있으며, Python은 이를 처리할 방법을 몰라합니다.
- ValueError: 함수가 올바른 형식의 인수를 받았지만 적절하지 않은 값일 때 발생합니다.
int("hello") # ValueError: int()에 유효하지 않은 리터럴: 'hello'
int() 함수는 숫자를 나타내는 문자열을 기대합니다, 단어는 아닙니다.
- ZeroDivisionError: 0으로 나누려고 시도할 때 발생합니다.
10 / 0 # ZeroDivisionError: 0으로 나누기
수학에서처럼, 프로그래밍에서도 0으로 나누는 것은 정의되지 않았습니다.
내장 예외의 계층 구조
Python의 내장 예외는 계층 구조에 나열되어 있습니다, 가족 트리와 유사합니다. 이 트리의 최상단에는 모든 다른 예외가 상속받는 BaseException 클래스가 있습니다.
다음은 예외 계층 구조의 간단화된 버전입니다:
예외 계층 구조 |
---|
BaseException |
├── SystemExit |
├── KeyboardInterrupt |
├── GeneratorExit |
└── Exception |
├── StopIteration |
├── ArithmeticError |
│ ├── FloatingPointError |
│ ├── OverflowError |
│ └── ZeroDivisionError |
├── AssertionError |
├── AttributeError |
├── BufferError |
├── EOFError |
├── ImportError |
│ └── ModuleNotFoundError |
├── LookupError |
│ ├── IndexError |
│ └── KeyError |
├── MemoryError |
├── NameError |
│ └── UnboundLocalError |
├── OSError |
│ ├── FileExistsError |
│ ├── FileNotFoundError |
│ ├── PermissionError |
│ └── TimeoutError |
├── ReferenceError |
├── RuntimeError |
│ └── NotImplementedError |
├── SyntaxError |
│ └── IndentationError |
│ └── TabError |
├── SystemError |
├── TypeError |
├── ValueError |
│ └── UnicodeError |
└── Warning |
이 계층 구조를 이해하면 코드에서 예외를 더 효과적으로 잡고 처리할 수 있습니다.
내장 예외 사용법
이제 예외가 무엇인지 알았으니, 코드에서 어떻게 사용하는지 배워보겠습니다. 예외를 처리하는 주요 방법은 try-except 블록을 사용하는 것입니다. 이는 자전거를 타는 데 있어서 안전 네트를 가지는 것과 같습니다 - 넘어졌을 때 (예외를 만났을 때), 네트(_except 블록)가 당신을 잡아줍니다.
기본적인 구조는 다음과 같습니다:
try:
# 예외를 일으킬 수 있는 코드
result = 10 / 0
except ZeroDivisionError:
# 특정 예외를 처리하는 코드
print("죄송합니다! 0으로 나눌 수 없습니다.")
이 예제에서는 0으로 나누려고 시도하며 ZeroDivisionError를 일으킬 것을 알고 있습니다. _except 블록이 이 특정 오류를 잡아 프로그램이 크래시하지 않고 친절한 메시지를 인쇄합니다.
여러 예외를 잡을 수도 있습니다:
try:
# 다른 예외를 일으킬 수 있는 코드
number = int(input("숫자를 입력하세요: "))
result = 10 / number
except ValueError:
print("유효한 숫자가 아닙니다!")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다!")
except:
print("다른 문제가 발생했습니다.")
이 스크립트는 다양한 시나리오를 처리합니다: 사용자가 숫자가 아닌 값을 입력하면 (ValueError), 0으로 나누려고 하면 (ZeroDivisionError), 그리고 예상치 못한 오류가 발생하면.
내장 예외를 명시적으로 발생시키기
가끔, 직접 예외를 발생시키고 싶을 때가 있습니다. 이는 축구 경기에서 심판이 잘못된 것을 발견하면 경기를 중단시키는 것과 같습니다.
예외를 발생시키는 방법은 다음과 같습니다:
def check_age(age):
if age < 0:
raise ValueError("나이는 음수일 수 없습니다!")
elif age < 18:
print("미성년자입니다.")
else:
print("성인입니다.")
try:
check_age(-5)
except ValueError as e:
print(e)
이 예제에서는 사람의 나이를 확인하는 함수를 만듭니다. 누군가 음수 나이를 입력하려고 시도하면, ValueError를 발생시키고 사용자 정의 메시지를 제공합니다. 함수 밖의 try-except 블록이 이 예외를 잡아서 오류 메시지를 인쇄합니다.
기억하세요, 예외를 발생시키는 것은 신중하게 해야 합니다. 강력한 도구이지만, 과도하게 사용하면 코드를 이해하고 유지하는 데 어려움을 겪을 수 있습니다.
결론적으로, Python의 내장 예외를 이해하고 효과적으로 사용하는 것은 견고하고 오류에 내성을 가진 코드를 작성하는 데 중요합니다. 이는 바다를 탐험하는 것과 같습니다 - 잠재적인 폭풍(예외)를 알고 있고, 이를 처리하는 방법을 아는 것이 프로그래밍 여정을 훨씬 부드럽고 즐겁게 만들어줍니다.
숙제를 계속하고, 호기심을 지켜요, 예외를 만나는 것을 두려워마세요 - 그들은 코드를 배우고 개선하는 기회입니다!
Credits: Image by storyset