|
1 | 1 | # 3.12. 파이썬 에러처리
|
2 | 2 |
|
| 3 | +프로그램을 만들다 보면 수없이 많은 에러가 발생합니다. 물론 오류가 발생하는 이유는 프로그램이 잘못 동작되는 것을 막기 위한 것입니다. Python은 Python 프로그램의 예상치 못한 오류를 처리하고 디버깅 기능을 추가하는 두 가지 중요한 기능을 제공합니다. |
| 4 | + |
| 5 | +* 예외 처리\(Exception Handling\) |
| 6 | +* 어설션\(Assertions\) |
| 7 | + |
| 8 | +#### 3.12.1. Assertions |
| 9 | + |
| 10 | +프로그램의 특정 지점에서 반드시 참\(True\)이 되어야 하는 문장을 말합니다. 일반적으로 오류를 확인하기 위해 코드에 Assertion을 넣습니다. Assertion이 실패하면 \(즉, 표현식이 거짓으로 평가되는 경우\) 프로그램이 중지되고 오류 메시지가 표시됩니다. |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +다음의 예제를 실행해 보면 개념이 명확해집니다. |
| 15 | + |
| 16 | +```python |
| 17 | +import time |
| 18 | + lists = [1,3,6,3,8,7,13,23,13,2,3.14,2,3,7] |
| 19 | + |
| 20 | + def test(t): |
| 21 | + print("현재 수행중인 값 =" + str(t)) |
| 22 | + assert (type(t) is int), "주어진 값 " + str(t) + " 은 정수가 아닙니다" |
| 23 | + |
| 24 | + for i in lists: |
| 25 | + test(i) |
| 26 | + time.sleep(1) |
| 27 | +``` |
| 28 | + |
| 29 | +```text |
| 30 | +현재 수행중인 값 =23 |
| 31 | +현재 수행중인 값 =13 |
| 32 | +현재 수행중인 값 =2 |
| 33 | +현재 수행중인 값 =3.14 |
| 34 | +Traceback (most recent call last): |
| 35 | + File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 9, in <module> |
| 36 | + test(i) |
| 37 | + File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 6, in test |
| 38 | + assert (type(t) is int), "주어진 값 " + str(t) + " 은 정수가 아닙니다" |
| 39 | +AssertionError: 주어진 값 3.14 은 정수가 아닙니다 |
| 40 | +Process finished with exit code 1 |
| 41 | +``` |
| 42 | + |
| 43 | +#### 3.12.2. 예외 처리\(Exception Handling\) |
| 44 | + |
| 45 | +문법과 관련된 에러는 파이썬 인터프리터에서 에러메시지를 표시하여 디버깅이 가능합니다. 문장이나 표현식이 문법적으로 올바르다 할지라도, 실행하려고 하면 에러를 일으킬 수 있습니다. 실행 중에 감지되는 에러들을 _예외\(_Exception\) 라고 합니다. 예외는 프로그램 실행 중에 발생하여 프로그램의 명령 흐름을 방해하는 이벤트입니다. 일반적으로, 파이썬은 대처할 수 없는 상황에 처하게 되면 예외를 발생시킵니다. 예외는 오류를 나타내는 Python 객체입니다. 예외가 발생되면 즉시 예외를 처리해야합니다. 그렇지 않으면 파이썬이 종료됩니다. |
| 46 | + |
| 47 | +예외처리를 위해 try, except문을 사용합니다. try, except 문에 대한 기본적인 구조는 아래와 같습니다. |
| 48 | + |
| 49 | +```python |
| 50 | +try: |
| 51 | + You do your operations here; |
| 52 | + ...................... |
| 53 | +except ExceptionI: |
| 54 | + If there is ExceptionI, then execute this block. |
| 55 | +except ExceptionII: |
| 56 | + If there is ExceptionII, then execute this block. |
| 57 | + ...................... |
| 58 | +else: |
| 59 | + If there is no exception then execute this block. |
| 60 | +``` |
| 61 | + |
| 62 | +예외를 발생시킬 수 있는 의심스러운 코드가 있는 경우 try: 블록에 의심스러운 코드를 넣어 프로그램을 방어적으로 코딩합니다. try: 블록 다음에 except: 문을 포함시키고 예외 문제를 처리하는 코드 블록을 추가합니다. |
| 63 | + |
| 64 | +이 예제는 쓰기 권한을 주고 파일을 열어 기록 하므로 정상 적으로 처리 됩니다. |
| 65 | + |
| 66 | +```python |
| 67 | +try: |
| 68 | + fh = open("testfile", "w") |
| 69 | + fh.write("This is my test file for exception handling!!") |
| 70 | + except IOError: |
| 71 | + print("Error: can\'t find file or read data") |
| 72 | + else: |
| 73 | + print("Written content in the file successfully") |
| 74 | + fh.close() |
| 75 | +``` |
| 76 | + |
| 77 | +아래 예제는 쓰기 권한이 없이 파일을 열고 기록을 시도하므로 예외가 발생합니다. |
| 78 | + |
| 79 | +```python |
| 80 | +try: |
| 81 | + fh = open("testfile", "r") |
| 82 | + fh.write("This is my test file for exception handling!!") |
| 83 | + except IOError: |
| 84 | + print("Error: can\'t find file or read data") |
| 85 | + else: |
| 86 | + print("Written content in the file successfully") |
| 87 | +``` |
| 88 | + |
| 89 | +아래 코드와 같이 finally 문을 사용 할 수도 있습니다. |
| 90 | + |
| 91 | +```python |
| 92 | +try: |
| 93 | + fh = open("testfile", "w") |
| 94 | + try: |
| 95 | + fh.write("This is my test file for exception handling!!") |
| 96 | + finally: |
| 97 | + print("Going to close the file") |
| 98 | + fh.close() |
| 99 | + except IOError: |
| 100 | + print("Error: can\'t find file or read data") |
| 101 | +``` |
| 102 | + |
| 103 | +try 블록에서 예외가 발생하면 finally 블록으로 즉시 전달됩니다. finally 블록의 모든 명령문이 실행된 후에 예외가 다시 발생하고 try-except 문의 다음 상위 계층에 있으면 exceptsatements에서 처리됩니다. |
| 104 | + |
| 105 | +#### 1.1.3. Exception의 인수\(Argument\) |
| 106 | + |
| 107 | +exception에는 추가 정보를 제공하는 인수가 있을 수 있습니다. 인수의 내용은 예외에 따라 다릅니다. 다음과 같이 except 절에 변수를 제공하여 예외의 인수를 캡처합니다. |
| 108 | + |
| 109 | +```python |
| 110 | +try: |
| 111 | + You do your operations here; |
| 112 | + ...................... |
| 113 | +except ExceptionType, Argument: |
| 114 | + You can print value of Argument here... |
| 115 | +``` |
| 116 | + |
| 117 | +단일 exception을 처리하기위한 코드를 작성하는 경우 except 문에서 예외 이름 뒤에 변수를 지정할 수 있습니다. 여러 exception을 트래핑하는 경우 exception 튜플을 사용할 수 있습니다. |
| 118 | + |
| 119 | +이 변수는 대부분 exception의 원인을 포함하는 exception의 값을 받습니다. 변수는 하나의 값 또는 튜플 형태의 다중 값을 수신할 수 있습니다. 이 튜플은 대개 오류 문자열, 오류 번호 및 오류 위치를 포함합니다. |
| 120 | + |
| 121 | +```python |
| 122 | +# Define a function here. |
| 123 | + def temp_convert(var): |
| 124 | + try: |
| 125 | + return int(var) |
| 126 | + except ValueError as Argument: |
| 127 | + print("The argument does not contain numbers\n", Argument) |
| 128 | + |
| 129 | + # Call above function here. |
| 130 | + temp_convert("xyz"); |
| 131 | +``` |
| 132 | + |
| 133 | +위의 코드는 다음과 같은 결과로 처리 됩니다. |
| 134 | + |
| 135 | +```text |
| 136 | +The argument does not contain numbers |
| 137 | + invalid literal for int() with base 10: 'xyz' |
| 138 | +``` |
| 139 | + |
| 140 | +#### 1.1.4. Exceptions의 발생 |
| 141 | + |
| 142 | +raise 문을 사용하여 여러 가지 방법으로 예외를 발생시킬 수 있습니다. raise 문에 대한 일반적인 구문은 다음과 같습니다. |
| 143 | + |
| 144 | +**raise \[Exception \[, args \[, traceback\]\]\]** |
| 145 | + |
| 146 | +여기서 Exception은 예외의 유형 \(예: Error명\)이고 argument는 예외 인수 값입니다. 인수는 선택 사항으로 제공되지 않으면 예외 인수는 없는것으로 처리됩니다. |
| 147 | + |
| 148 | +마지막 인자인 traceback은 선택적이며 \(실제로는 거의 사용되지 않는다.\), 존재한다면 예외에 사용되는 traceback 객체입니다. |
| 149 | + |
| 150 | +예외는 문자열, 클래스 또는 객체가 될 수 있습니다. 파이썬 코어가 제기하는 대부분의 예외는 클래스이며, 클래스의 인스턴스인 인수가 있습니다. 새로운 예외를 정의하는 것은 매우 쉽고 다음과 같이 할 수 있습니다. |
| 151 | + |
| 152 | +```python |
| 153 | +def functionName( level ): |
| 154 | + if level < 1: |
| 155 | + raise "Invalid level!", level |
| 156 | + # The code below to this would not be executed |
| 157 | + # if we raise the exception |
| 158 | +``` |
| 159 | + |
| 160 | +다음과 같은 예제를 실행해 보겠습니다. |
| 161 | + |
| 162 | +```python |
| 163 | +x = 5 |
| 164 | +if x < 10: |
| 165 | + raise ValueError('x should not be less than 10!') |
| 166 | +``` |
| 167 | + |
0 commit comments