Skip to content

Latest commit

ย 

History

History
167 lines (126 loc) ยท 6.94 KB

File metadata and controls

167 lines (126 loc) ยท 6.94 KB

3.13. ํŒŒ์ด์ฌ ์—๋Ÿฌ์ฒ˜๋ฆฌ

ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์ˆ˜์—†์ด ๋งŽ์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜๋ชป ๋™์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Python์€ Python ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(Exception Handling)
  • ์–ด์„ค์…˜(Assertions)

3.13.1. Assertions

ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์ • ์ง€์ ์—์„œ ๋ฐ˜๋“œ์‹œ ์ฐธ(True)์ด ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์žฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ์— Assertion์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. Assertion์ด ์‹คํŒจํ•˜๋ฉด (์ฆ‰, ํ‘œํ˜„์‹์ด ๊ฑฐ์ง“์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ) ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘์ง€๋˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ๊ฐœ๋…์ด ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

import time
 lists = [1,3,6,3,8,7,13,23,13,2,3.14,2,3,7]

 def test(t):
     print("ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๊ฐ’ =" + str(t))
     assert (type(t) is int), "์ฃผ์–ด์ง„ ๊ฐ’ " + str(t) + " ์€ ์ •์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"

 for i in lists:
   test(i)
   time.sleep(1)
ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๊ฐ’ =23
ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๊ฐ’ =13
ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๊ฐ’ =2
ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ๊ฐ’ =3.14
Traceback (most recent call last):
  File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 9, in <module>
    test(i)
  File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 6, in test
    assert (type(t) is int), "์ฃผ์–ด์ง„ ๊ฐ’ " + str(t) + " ์€ ์ •์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"
AssertionError: ์ฃผ์–ด์ง„ ๊ฐ’ 3.14 ์€ ์ •์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
Process finished with exit code 1

3.13.2. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(Exception Handling)

๋ฌธ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ์—๋Ÿฌ๋Š” ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์žฅ์ด๋‚˜ ํ‘œํ˜„์‹์ด ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๋‹ค ํ• ์ง€๋ผ๋„, ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์— ๊ฐ์ง€๋˜๋Š” ์—๋Ÿฌ๋“ค์„ _์˜ˆ์™ธ(_Exception) ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ช…๋ น ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜๋Š” ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ํŒŒ์ด์ฌ์€ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ์ฒ˜ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Python ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์ฆ‰์‹œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŒŒ์ด์ฌ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด try, except๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. try, except ๋ฌธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ try: ๋ธ”๋ก์— ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฉ์–ด์ ์œผ๋กœ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. try: ๋ธ”๋ก ๋‹ค์Œ์— except: ๋ฌธ์„ ํฌํ•จ์‹œํ‚ค๊ณ  ์˜ˆ์™ธ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ฃผ๊ณ  ํŒŒ์ผ์„ ์—ด์–ด ๊ธฐ๋ก ํ•˜๋ฏ€๋กœ ์ •์ƒ ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
 except IOError:
    print("Error: can\'t find file or read data")
 else:
    print("Written content in the file successfully")
    fh.close()

์•„๋ž˜ ์˜ˆ์ œ๋Š” ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์ด ํŒŒ์ผ์„ ์—ด๊ณ  ๊ธฐ๋ก์„ ์‹œ๋„ํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

try:
    fh = open("testfile", "r")
    fh.write("This is my test file for exception handling!!")
 except IOError:
    print("Error: can\'t find file or read data")
 else:
    print("Written content in the file successfully")

์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด finally ๋ฌธ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

try:
    fh = open("testfile", "w")
    try:
       fh.write("This is my test file for exception handling!!")
    finally:
       print("Going to close the file")
       fh.close()
 except IOError:
    print("Error: can\'t find file or read data")

try ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด finally ๋ธ”๋ก์œผ๋กœ ์ฆ‰์‹œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. finally ๋ธ”๋ก์˜ ๋ชจ๋“  ๋ช…๋ น๋ฌธ์ด ์‹คํ–‰๋œ ํ›„์— ์˜ˆ์™ธ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๊ณ  try-except ๋ฌธ์˜ ๋‹ค์Œ ์ƒ์œ„ ๊ณ„์ธต์— ์žˆ์œผ๋ฉด exceptsatements์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

3.13.3. Exception์˜ ์ธ์ˆ˜(Argument)

exception์—๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜์˜ ๋‚ด์šฉ์€ ์˜ˆ์™ธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด except ์ ˆ์— ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์˜ˆ์™ธ์˜ ์ธ์ˆ˜๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

๋‹จ์ผ exception์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ except ๋ฌธ์—์„œ ์˜ˆ์™ธ ์ด๋ฆ„ ๋’ค์— ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ exception์„ ํŠธ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ exception ํŠœํ”Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€์ˆ˜๋Š” ๋Œ€๋ถ€๋ถ„ exception์˜ ์›์ธ์„ ํฌํ•จํ•˜๋Š” exception์˜ ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ฐ’ ๋˜๋Š” ํŠœํ”Œ ํ˜•ํƒœ์˜ ๋‹ค์ค‘ ๊ฐ’์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠœํ”Œ์€ ๋Œ€๊ฐœ ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด, ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ ๋ฐ ์˜ค๋ฅ˜ ์œ„์น˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

# Define a function here.
 def temp_convert(var):
    try:
       return int(var)
    except ValueError as Argument:
       print("The argument does not contain numbers\n", Argument)

 # Call above function here.
 temp_convert("xyz");

์œ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋กœ ์ฒ˜๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

The argument does not contain numbers
 invalid literal for int() with base 10: 'xyz'

3.13.4. Exceptions์˜ ๋ฐœ์ƒ

raise ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. raise ๋ฌธ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

raise [Exception [, args [, traceback]]]

์—ฌ๊ธฐ์„œ Exception์€ ์˜ˆ์™ธ์˜ ์œ ํ˜• (์˜ˆ: Error๋ช…)์ด๊ณ  argument๋Š” ์˜ˆ์™ธ ์ธ์ˆ˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ ์ธ์ˆ˜๋Š” ์—†๋Š”๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ธ์ž์ธ traceback์€ ์„ ํƒ์ ์ด๋ฉฐ (์‹ค์ œ๋กœ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.), ์กด์žฌํ•œ๋‹ค๋ฉด ์˜ˆ์™ธ์— ์‚ฌ์šฉ๋˜๋Š” traceback ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋Š” ๋ฌธ์ž์—ด, ํด๋ž˜์Šค ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์ฝ”์–ด๊ฐ€ ์ œ๊ธฐํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์™ธ๋Š” ํด๋ž˜์Šค์ด๋ฉฐ, ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

x = 5
if x < 10:
    raise ValueError('x should not be less than 10!')