pocket

[Python] μ˜ˆμ™Έ 처리(ꡬ문 였λ₯˜, λŸ°νƒ€μž„ μ—λŸ¬) λ³Έλ¬Έ

Python

[Python] μ˜ˆμ™Έ 처리(ꡬ문 였λ₯˜, λŸ°νƒ€μž„ μ—λŸ¬)

jpocket 2025. 4. 3. 00:11
λ°˜μ‘ν˜•

 

 

πŸ›  였λ₯˜ μ’…λ₯˜

error μ—λŠ” ꡬ문 였λ₯˜ Syntax error 와 μ˜ˆμ™Έ exception λ˜λŠ” λŸ°νƒ€μž„ 였λ₯˜ runtime error κ°€ μžˆλ‹€.

μ΄λ ‡κ²Œ κ΅¬λΆ„λ˜λŠ” 기쀀은, ν”„λ‘œκ·Έλž˜λ° μ‹€ν–‰ μ „κ³Ό ν›„λ‘œ λ‚˜λ‰œλ‹€.

 

 

πŸ›  ꡬ문 였λ₯˜ Syntax error

ν”„λ‘œκ·Έλž˜λ° μ‹€ν–‰ 전에 λ‚˜μ˜€λŠ” 였λ₯˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² λ‹€.

 

SyntaxErrorλ‹ˆκΉŒ πŸ’¬ "μ•„~ μ‹€ν–‰ 전에 였λ₯˜κ°€ λ°œμƒν–ˆκ΅¬λ‚˜. ꡬ문 였λ₯˜κ΅¬λ‚˜." 라고 μ•Œ 수 μžˆλ‹€.

πŸ’¬  “μ½”λ“œλ₯Ό 잘λͺ» μ³€λ‹€λŠ” 말”인데 μ–΄λ””μ„œ 잘λͺ» λœκ±°μ§€?

  File "/tmp/ipykernel_20/138810778.py", line 2
    print('μ•ˆλ…•ν•˜μ„Έμš”")
                  ^
SyntaxError: EOL while scanning string literal**SyntaxError: EOL while scanning string literal

SyntaxError: EOL while scanning string literal**

 

line 2 번째 쀄에, print('μ•ˆλ…•ν•˜μ„Έμš”") λΆ€λΆ„μ—μ„œ μ—λŸ¬κ°€ 났닀고 ν•œλ‹€.

μ–΄λ–€ μ—λŸ¬μΈμ§€ λ΄€λ”λ‹ˆ, SyntaxError: EOL while scanning string literal 라고 ν•œλ‹€.

해석해보면, (gptκ°€ ν•΄μ„ν•΄μ€Œ)

λ¬Έμžμ—΄μ„ μ œλŒ€λ‘œ λ‹«μ§€ μ•Šμ•„μ„œ λ°œμƒν•˜λŠ” 였λ₯˜μ˜ˆμš”.

라고 λ‹΅ν•΄μ€€λ‹€.

 

λ¬Έμžμ—΄μ„ λ‹«μœΌλ €λ©΄ “ “ ν˜•νƒœμ΄μ–΄μ•Ό ν•˜λŠ”λ° μ§€κΈˆμ€ ‘ “ λΌμ„œ 였λ₯˜κ°€ μƒκ²Όλ‹€λŠ” κ±Έ μ•Œ 수 μžˆλ‹€.

λ‹€μ‹œ " " 둜 μˆ˜μ •ν•˜λ©΄ μ•Œλ§žκ²Œ 좜λ ₯λœλ‹€.

 

 

 

πŸ›  μ˜ˆμ™Έ(Exception) λ˜λŠ” λŸ°νƒ€μž„ 였λ₯˜(Runtime Error)

ν”„λ‘œκ·Έλž˜λ° μ‹€ν–‰ ν›„ λ‚˜μ˜€λŠ” 였λ₯˜λ“€μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² λ‹€.

 

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_20/688360506.py in <module>
      1 # 주석을 ν’€κ³  μ—λŸ¬λ₯Ό ν™•μΈν•΄λ³΄μ„Έμš”.
      2 # μ—†λŠ” 리슀트의 인덱싱 βž” μ˜ˆμ™Έ
----> 3 list_a[0]

NameError: name 'list_a' is not defined

list_a κ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜λ‹€κ³  ν•œλ‹€. πŸ’¬μ•„~ list_aκ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜λŠ”λ° μ‚¬μš©μ΄ λ˜μ—ˆλ‚˜λ³΄λ‹€. μ„ μ–Έν•΄μ•Όκ² λ‹€! 

κ·Έλ ‡λ‹€λ©΄ list_aλ₯Ό μ„ μ–Έ ν›„(=μ •μ˜ ν›„), μ•Œλ§žκ²Œ 싀행이 λœλ‹€.

 

 

 

이런 μ˜ˆμ™Έλ₯Ό ν•΄κ²°ν•˜λŠ” λͺ¨λ“  것을 πŸ›  μ˜ˆμ™Έ 처리(Exceptional Handling) 라고 λΆ€λ₯Έλ‹€.

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법은 두 κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

  • 쑰건문 μ‚¬μš©
  • try ꡬ문 μ‚¬μš©

❓ κ·Έλ ‡λ‹€λ©΄ ꡬ문 였λ₯˜λŠ” 처리 방법이 μ—†λ‚˜?

βœ… ꡬ문 였λ₯˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ‹€ν–‰ 전에 μ—λŸ¬κ°€ λ‚˜λŠ” 것이기 λ•Œλ¬Έμ—

μ—λŸ¬μ— λŒ€ν•œ μ„€λͺ…을 톡해 μ•Œλ§žμ€ μ½”λ“œλ‘œ μˆ˜μ •ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

 

⭐⭐⭐

 

 

 

 

 


πŸ›  μ˜ˆμ™Έ 처리 (Exception Handling)

  • 쑰건문
  • try - except κ΅¬λ¬Έ

 

 

πŸ›  쑰건문

num = (input("λ‚˜λˆŒ 숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
if num.isdigit():
	print(int(num))
elif num.lstrip("-").isdigit():
    print(int(num))
else:
	print("μˆ«μžκ°€ μ•„λ‹™λ‹ˆλ‹€.")

πŸ’‘ μ„€λͺ…

  • μ˜ˆμ™Έ (ZeroDivisionError) κ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œλ₯Ό 쑰건문으둜 미리 차단

πŸ“Œ ν•¨μˆ˜ 정리

  • isdigit(): λ¬Έμžμ—΄μ΄ μˆ«μžμΈμ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜
  • lstrip(): λ²—κΈ°κ³  싢은 λ¬Έμžμ—΄μ„ λ²—κΈ°λŠ” ν•¨μˆ˜

 

 


πŸ›  try - except κ΅¬λ¬Έ

try:
    μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œ
except (λ°œμƒ 였λ₯˜ (as λ°œμƒ 였λ₯˜ λ³€μˆ˜)):
    μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ

 

πŸ›  try - except - pass ꡬ문

# try - except - pass ꡬ문 
# μ‹œλ„ν•  μ½”λ“œ
try:
    # μ˜ˆμ™Έ κ±±μ • 없이 μž…λ ₯값에 float ν•¨μˆ˜λ₯Ό μ”Œμ›€
    num = float(input('수λ₯Ό μž…λ ₯ν•˜μ„Έμš” : '))
    print(f'μž…λ ₯ν•œ μˆ˜λŠ” {num}μž…λ‹ˆλ‹€.')

# tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
except:
    pass

print('끝!')

 

 

πŸ”₯ 쑰건문 vs try-exceptꡬ문 πŸ”₯

πŸ’‘μ˜ˆμ™Έ 처리λ₯Ό ν•˜λŠ” 두 ꡬ문의 속도λ₯Ό λΉ„κ΅ν•˜λ©΄ try - except ꡬ문이 쑰건문보닀 μ•½κ°„ λŠλ¦¬λ‹€.

κ·ΈλŸ¬λ‚˜ 파이썬 μžμ²΄κ°€ κ·Έλ ‡κ²Œ 속도λ₯Ό μ€‘μš”μ‹œν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ μ•„λ‹ˆλ―€λ‘œ

μ½”λ“œλ₯Ό 쑰금 더 μ‰½κ²Œ μž‘μ„±ν•  λͺ©μ μ΄λΌλ©΄, βœ… 쑰건문보닀 try - except ꡬ문을 μ‚¬μš©ν•˜λŠ” 게 μ’‹λ‹€.

 

 

 

πŸ›  try - except - else κ΅¬λ¬Έ

try - except κ΅¬λ¬Έμ— elseλ₯Ό μΆ”κ°€ν•˜λ©΄ 'μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ'λ₯Ό μ§€μ •ν•  수 μžˆλ‹€.

κΈ°λ³Έ κ΅¬μ‘°λŠ” try - except ꡬ문에 else만 μΆ”κ°€ν•˜λ©΄ λœλ‹€.

try:
    μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œ
except:
    에외가 λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
else:
    μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
# try - except - else ꡬ문 

# μ‹œλ„ν•  μ½”λ“œ
try:
    # μ˜ˆμ™Έ κ±±μ • 없이 μž…λ ₯값에 float ν•¨μˆ˜λ₯Ό μ”Œμ›€
    num = float(input('수λ₯Ό μž…λ ₯ν•˜μ„Έμš” : '))

# tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
except:
    print('μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.')

# tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
else:
    print(f'μž…λ ₯ν•œ μˆ˜λŠ” {num}μž…λ‹ˆλ‹€.')

 

❓ 그런데 elseκ°€ μ—†λ˜ try - except ꡬ문과 차이가 λ³„λ‘œ μ—†μ–΄ 보인닀. 그러면 μ™œ else ꡬ문을 μ“°λŠ” 걸까?

개발자의 μŠ€νƒ€μΌμ— 따라 else ꡬ문 μ‚¬μš© μœ λ¬΄λŠ” 선택이닀. μš°λ¦¬λŠ” μ½”λ“œλ₯Ό μ§œλŠ” 일뿐만 μ•„λ‹ˆλΌ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  μ½”λ“œλ₯Ό 읽고 이해할 수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ βœ… else ꡬ문을 κΈ°μ–΅ν•΄ λ‘λ˜, 각자의 μŠ€νƒ€μΌλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

 

 

πŸ›  try - except - else - finally κ΅¬λ¬Έ

μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ“  λ°œμƒν•˜μ§€ μ•Šλ“  무쑰건 μ‹€ν–‰ν•˜κ³  싢은 μ½”λ“œλŠ” finally κ΅¬λ¬Έμ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

try:
    μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œ
except:
    μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
else:
    μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
finally:
    에외와 관계없이 무쑰건 μ‹€ν–‰λ˜λŠ” μ½”λ“œ
# try - except - else - finally ꡬ문 

# μ‹œλ„ν•  μ½”λ“œ 
try:
    # μ˜ˆμ™Έ κ±±μ • 없이 μž…λ ₯값에 float ν•¨μˆ˜λ₯Ό μ”Œμ›€
    num = float(input('수λ₯Ό μž…λ ₯ν•˜μ„Έμš” : '))

# tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œ
except:
    print('μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.')

# tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ‹€ν–‰ν•  μ½”λ“œ
else:
    print(f'μž…λ ₯ν•œ μˆ˜λŠ” {num}μž…λ‹ˆλ‹€.')

# finally ꡬ문 μΆ”κ°€
finally:
    print('*' * 25)
    print('ν”„λ‘œκ·Έλž¨μ΄ λλ‚¬μŠ΅λ‹ˆλ‹€.')

 

 

 


πŸ“Œ μ˜ˆμ™Έ 처리 ꡬ문의 κ·œμΉ™πŸ“Œ

tryλŠ” 혼자 μžˆμ„ 수 μ—†λ‹€. except λ˜λŠ” finally ꡬ문과 ν•¨κ»˜ μžˆμ–΄μ•Ό ν•œλ‹€.

else ꡬ문은 except와 ν•¨κ»˜ 쓰이고, except ꡬ문 뒀에 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • try + except
  • try + except + else
  • try + except + finally
  • try + except + else + finally
  • try + finally

 

 

 


πŸ›  μ—λŸ¬

πŸ”Άraise ν‚€μ›Œλ“œ

ν”„λ‘œκ·Έλž¨μ— μΌλΆ€λŸ¬ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ λ•ŒλŠ” raise에 μ—λŸ¬λ₯Ό μ§€μ •ν•˜κ³  μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό λ„£λŠ”λ‹€.

μ—λŸ¬ λ©”μ‹œμ§€λŠ” μƒλž΅ν•  수 있기 λ•Œλ¬Έμ— raise만 μ‚¬μš©ν•΄λ„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

파이썬의 μ—λŸ¬ μ’…λ₯˜λŠ” λͺ¨λ“  μ—λŸ¬μ˜ μ–΄λ¨Έλ‹ˆμΈ Exception 외에도 λ‹€μ–‘ν•˜λ‹€.

 

 

 

πŸ“Œ μ—λŸ¬μ˜ μ’…λ₯˜ πŸ“Œ

  • SyntaxError : 잘λͺ»λœ 문법 ꡬ문 였λ₯˜μž…λ‹ˆλ‹€.

 

  • NameError : μ°Έμ‘°λ³€μˆ˜ μ—†μŒ 예λ₯Ό λ“€λ©΄ μ½”λ“œμ—μ„œ λ³€μˆ˜ aλ₯Ό 좜λ ₯ν•˜λ„λ‘ ν–ˆλŠ”λ°, μ½”λ“œ μƒμ—μ„œ a μ„ μ–Έν•œ 적이 없을 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μž…λ‹ˆλ‹€. NameError: name 'a' is not defined λΌκ³  뜨고, 이름이 μ •μ˜λ˜μ§€ μ•Šμ•˜λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

  • ZeroDivisionError : 0으둜 λ‚˜λˆŒ 수 μ—†μŒνŒŒμ΄μ¬μ—μ„œ print(10 / 0)μ΄λΌλŠ” μ½”λ“œλŠ” 10 λ‚˜λˆ„κΈ° 0 값을 좜λ ₯ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ¬Έλ²•μ μœΌλ‘œλŠ” μ—λŸ¬κ°€ μ—†μ§€λ§Œ 막상 μ‹€ν–‰ν•˜λ©΄ λŸ°νƒ€μž„ μ‹œμ— ZeroDivisionError: division by zero λΌλŠ” 였λ₯˜ λ©”μ‹œμ§€κ°€ λœΉλ‹ˆλ‹€.

 

  • IndexError : 인덱슀 λ²”μœ„ λ²—μ–΄λ‚¨λ¦¬μŠ€νŠΈμ— μ—†λŠ” μ›μ†Œλ₯Ό ν˜ΈμΆœν•  경우 λ°œμƒν•˜λŠ” μ—λŸ¬μž…λ‹ˆλ‹€. IndexError: list index out of range μ™€ 같이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬λ‹€λŠ” λ©”μ‹œμ§€κ°€ λœΉλ‹ˆλ‹€.

 

  • ValueError : μ°Έμ‘° 값이 μ—†μŒ. λ¦¬μŠ€νŠΈμ— μ—†λŠ” μš”μ†Œλ₯Ό μ§€μš°λ €κ³  ν•˜λ©΄ μ• μ΄ˆμ— 그런 값이 μ—†κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

  • KeyError : ν‚€ μ—†μŒ μ—λŸ¬ (주둜 λ”•μ…”λ„ˆλ¦¬ μ‚¬μš©μ‹œ). λ”•μ…”λ„ˆλ¦¬μ— μ—†λŠ” ν‚€λ₯Ό ν˜ΈμΆœν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μž…λ‹ˆλ‹€.
# KeyError
mydict = {'Kim': 1, 'Lee': 2}
print(mydict['Park'])

 

이럴 땐 get λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ ν•΄κ²°λ©λ‹ˆλ‹€. print(mydict.get('Park'))라고 써보면 None이 좜λ ₯λ©λ‹ˆλ‹€. ν‚€κ°€ 없을 경우 None값이 λ°˜ν™˜λ©λ‹ˆλ‹€. κ·Έ 뒀에 ν‚€κ°€ 없을 λ•Œ λ°˜ν™˜ν•  값을 지정해놓아도 λ©λ‹ˆλ‹€.

 

  • AttributeError : λͺ¨λ“ˆ, 클래슀의 잘λͺ»λœ 속성을 μ‚¬μš©ν•¨. 곧이어 배울 λͺ¨λ“ˆκ³Ό ν΄λž˜μŠ€μ—μ„œ λ‚˜μ˜¬ 수 μžˆλŠ” 였λ₯˜λ‘œ λͺ¨λ“ˆμ— μ—†λŠ” ν•¨μˆ˜λ₯Ό μ“°λ €κ³  ν•  λ•Œ λ‚˜μ˜΅λ‹ˆλ‹€.

 

  • FileNotFoundError : 파일 λͺ» 찾음

ν•΄λ‹Ή κ²½λ‘œμ— 파일이 μ—†λ‹€λ©΄ FileNotFoundError: [Errno 2] No such file or directory: 'ex.txt' λΌλŠ” λ©”μ‹œμ§€κ°€ λœΉλ‹ˆλ‹€. 그런 νŒŒμΌμ΄λ‚˜ 디렉토리(폴더)κ°€ μ—†λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

  • TypeError : νƒ€μž…μ΄ λ§žμ§€ μ•ŠμŒ

μ—°μ‚° 등을 ν•  λ•Œ νƒ€μž…μ΄ μ„œλ‘œ λ§žμ§€ μ•Šμ„ λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ¦¬μŠ€νŠΈμ™€ λ¬Έμžμ—΄μ„ μ—°κ²°ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€. TypeError: can only concatenate list (not "str") to list λΌκ³  ν•΄μ„œ 'λ¦¬μŠ€νŠΈλŠ” (λ¬Έμžμ—΄μ΄ μ•„λ‹Œ) λ¦¬μŠ€νŠΈμ™€ κ²°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€'λΌλŠ” λœ»μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

 

 

 


μ˜ˆμ™Έ 처리 μ „λž΅ (EAFP vs LBYL)

μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ κ²ƒλ“€λ§Œ 해도 μ—λŸ¬μ˜ μ’…λ₯˜κ°€ μ°Έ λ§Žμ€λ°, 또 μ–΄λ””μ„œ μ–΄λ–€ μ—λŸ¬κ°€ λ°œμƒν• μ§€ λͺ¨λ₯Έλ‹€. κ·Έλž˜μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 크게 두가지 μ „λž΅μ„ μ‚¬μš©ν•˜κ³€ ν•œλ‹€.

 

πŸ”Ά EAFP: “It’s Easier to Ask Forgiveness than Permission”, 미리 ν—ˆλ½μ„ κ΅¬ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” λ‚˜μ€‘μ— μš©μ„œλ₯Ό κ΅¬ν•˜λŠ” 게 μ‰½λ‹€λŠ” 뜻.πŸ˜‰

일단 항상 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ κ²ƒμœΌλ‘œ κ°€μ •ν•˜κ³  λ‚˜λ¦„λŒ€λ‘œμ˜ μ™„λ²½ν•œ 코딩을 ν•œλ‹€. κ·Έ ν›„ μ½”λ“œ 싀행을 ν–ˆλŠ”λ° λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€λ©΄, κ·Έλ•Œ μ˜ˆμ™Έμ²˜λ¦¬ 코딩을 ν•˜λŠ” 게 μ’‹λ‹€λŠ” μ „λž΅μ΄λ‹€. κ·Έλž˜μ„œ 일단 μˆ˜ν–‰(try)μ‹œν‚€κ³ , λ§Œμ•½ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ κ·Έλ•Œ 처리(except)ν•œλ‹€λŠ” μŠ€νƒ€μΌλ‘œ μ½”λ”©ν•œλ‹€.

 

 

πŸ”Ά LBYL: “Look Before You Leap”, λˆ„μšΈ 자리λ₯Ό 보고 닀리λ₯Ό λ»—μœΌλΌλŠ” 뜻.πŸ˜‰

μ–΄λ–€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλŠ” 쑰건을 미리 λ‹€ 따져보고 κ·Έκ±Έ μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€ 쑰건문(ifλ¬Έ) μŠ€νƒ€μΌλ‘œ μ½”λ”©ν•˜λŠ” μ „λž΅μ΄λ‹€.

 

 

 

 

 

 


πŸ’¬ 미리 쑰건을 따져보고 μ½”λ”©ν•˜λ˜, λͺ¨λ“  였λ₯˜λ₯Ό μ˜ˆμΈ‘ν•˜κΈ΄ μ–΄λ ΅λ‹€. λ‚˜λ¦„λŒ€λ‘œ μ™„λ²½ν•œ μ½”λ”©ν•œ λ’€, λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒν•œ 것에 λŒ€ν•΄ μ˜ˆμ™Έμ²˜λ¦¬ μ½”λ”©ν•˜λŠ” μ „λž΅μ΄ μ§€κΈˆκΉŒμ§€ λ‚΄κ°€ μ½”λ”©ν•˜λ˜ 방식이닀. 항상 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ κ²ƒμ‘λ‘œ κ°€μ •ν•˜κ³  μ½”λ”©ν•˜λ”λΌλ„, μ˜ˆμ™Έ μ²˜λ¦¬ν•˜κ²Œ λ˜λ©΄μ„œ μ½”λ“œκ°€ λŒ€ν­ μˆ˜μ •λ˜κΈ°λ„ ν•˜κ³ ,, λ‚˜λŠ” 기본적으둜 LBYL λ°©μ‹μœΌλ‘œ μ½”λ”©ν•˜μ§€λ§Œ, λΆ€μ‘±ν•œ 뢀뢄이 발견되면 EAFP 방식을 μΆ”κ°€ν•˜λŠ” ν˜Όν•©ν˜• μŠ€νƒ€μΌμ΄λΌκ³  λ³Ό 수 μžˆλ‹€.πŸš€

 

πŸŽ―λ‹€μ–‘ν•œ 였λ₯˜ μ’…λ₯˜λ“€μ„ ν•™μŠ΅ν•˜μ˜€λŠ”λ° 였λ₯˜λ₯Ό μ•”κΈ°ν•˜κΈ° λ³΄λ‹€λŠ” 였λ₯˜λ₯Ό λ§Œλ‚¬μ„ λ•Œ μ–΄λ–»κ²Œ “ν•΄κ²°” ν•˜λŠ”μ§€ κ³΅λΆ€ν•˜λ©΄ 쒋을 것 κ°™λ‹€. πŸ€“πŸ€“

 

λ°˜μ‘ν˜•