| English | 의미 |
|---|---|
| exception/ekˈsepʃn/ | 예외 |
| exception handling/ekˈsepʃn ˈhændlɪŋ/ | 예외 처리 |
| raise/reɪz/ | 발생 |
쓸 수 없는 검증
- 프로그램이 파일을 엽니다. 파일을 열기 전에 해당 파일이 존재하는지, 읽을 수 있는지, 디스크가 연결되어 있는지를 검증할 수 있습니다. 모든 검증이 통과한다고 가정해 봅시다.
- 마지막 검증과 열기 사이에서 사용자가 USB 스틱을 제거합니다. 질문했을 때는 파일이 존재했으나 열 때는 존재하지 않으며, 사전 검증으로는 이 간극을 메울 수 없습니다.
- 일부 오류는 테스트와 실행 사이 세상이 변하기 때문에 단순히 예방할 수 없습니다. 프로그램이 할 수 있는 일은 오류가 발생할 때 대응하는 것입니다.
- 이 교훈은 예외이며, 하나를 처리하는 TRY 구조이고, 프로그램 내에서 예외를 잡아야 하는 위치입니다.
예외란 무엇이며 왜 처리해야 하는가
- 예외는 실행 중 발생하는 오류: 0으로 나누기, 파일 찾지 못함, 유효하지 않은 입력, 네트워크断开 등입니다.
- 예외 처리는 프로그램이 오류를 감지하고 crashing하여 사용자의 작업을 잃는 대신 통제된 방식으로 대응할 수 있게 합니다.
- 실제 프로그램은 후크가 보여주는 것처럼 사전 방지할 수 없는 오류에 직면합니다. 그리고 예외가 없다면 모든 연산마다 자체적인
IF검증이 필요하여 실제 알고리즘이 오류 테스트 속에 묻히게 됩니다. - 세 번째 장점은exam에서 가장 자주 묻는 것입니다: 정상 흐름과 오류 처리를 분리하여 주요 경로가 깔끔하게 읽히게 합니다.
예외란:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
예외 처리는 실행 중 오류(0으로 나누기, 파일 찾지 못함 등)를 gracefully하게 대응할 수 있게 해줍니다.
왜 모든 오류를 사전에 확인하는 대신 예외 처리를 사용합니까? 모든 정답을 선택하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
이점에는 정확성과 가독성이 포함됩니다. 속도는 해당하지 않으며, 예외 처리로 인한 약간의 오버헤드는 감당할 가치가 있습니다.
TRY 구조
TRY
OPENFILE "data.txt" FOR READ
READFILE "data.txt", line
CLOSEFILE "data.txt"
EXCEPT FileNotFound
OUTPUT "Sorry, the file does not exist."
EXCEPT ReadError
OUTPUT "Sorry, there was an error reading the file."
FINALLY
OUTPUT "Finished attempting to read."
ENDTRY
- TRY 블록은 실행 중 오류가 발생할 수 있는 코드를 포함합니다. 에러 없이 실행되면 EXCEPT 블록은 완전히 건너뜁니다.
- 예외가 발생하면 실행이 즉시 첫 번째 매칭 EXCEPT 블록으로 점프합니다. TRY 블록의 나머지 부분은 실행되지 않습니다.
- FINALLY 블록은 예외가 발생했는지 여부와 상관없이 실행되므로, 파일 닫기와 같은 정리 작업에 적합한 위치입니다.

모든 것이 잘 될 때의 한 경로, 그렇지 않을 때의 다른 경로, 그리고 항상 실행되는 하나의 경로
예외 처리 흐름
코드가 실패했을 때 일어나는 과정을 단계별로 설명하십시오. 예외는 정상 흐름에서 핸들러로 점프하고, FINALLY는 어떤 경우든 정리하며, 프로그램은 충돌하지 않고 계속 실행됩니다.
각 예외 처리 키워드를 그 역할과 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
TRY는 위험한 코드를 보호하고, EXCEPT는 예외를 잡으며, FINALLY는 어떤 경우에도 정리하며, RAISE는 잡힐 수 있는 오류를 발생시킵니다.
FINALLY 블록:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
FINALLY는 항상 실행되므로 파일 닫기 같은 정리에 가장 적합합니다.
예외 발생 유무와 관계없이 실행되어 파일을 닫기에 적합한 블록은 ____입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
정리 작업은 두 경로 모두에서 이루어져야 합니다. CLOSEFILE을 TRY 블록에만 넣으면 오류로 인해 파일이 열린 상태가 되는 순간 정확히 건너뛰어집니다.
worked example: 흐름 추적
- 위 코드에서 해당 파일은 존재하지 않습니다. 정확히 어떤 출력이 생성되고 어떤 부분이 건너뛰어지는지 설명하십시오.
OPENFILE이 FileNotFound를 발생시키므로, 실행은 TRY 블록을 즉시 이탈합니다:READFILE및CLOSEFILE줄은 절대 실행되지 않습니다.FileNotFoundEXCEPT 블록이 실행되어 "Sorry, the file does not exist."를 출력합니다. 첫 번째 매칭 핸들러만 사용되므로ReadError블록은 실행되지 않습니다.- FINALLY 블록이 실행되어 "Finished attempting to read."를 출력합니다.
- 가장 자주 잃는 점은 TRY 블록의 나머지가 포기됨을 인지하는 것입니다.
TRY 블록의 파일이 존재하지 않을 때, 다음 순서대로发生了什么 happens to occur in order.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
첫 번째 일치하는 핸들러만 실행되고, FINALLY는 반드시 실행됩니다. 건너뛰어진 남은 TRY 블록이 가장 자주 놓치는 부분입니다.
예외 발생(Raising an exception)
- 스스로 해결할 수 없는 문제를 감지한 서브루틴은 예외를 발생(raise) 시켜 호출자에게 책임을 넘길 수 있습니다:
IF b = 0 THEN RAISE DivideByZero
- 서브루틴이 문제가 있음을 알고 있지만 어떻게 해야 할지는 모르는 경우, 이 설계가 적절합니다. 나눗셈 루틴은 제수가 0임을 알지만, 호출자가 다시 요청할지 기본값을 사용할지 계산 중단을 할지는 callers에게 맡겨야 합니다.
서브루틴은 RAISE를 사용하여:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
RAISE는 예외를 호출자에게 전달하여, 호출자는 EXCEPT로 이를 잡을 수 있습니다.
왜 0으로 나누기 서브루틴이 자체적으로 오류를 처리하는 대신 예외를 raise합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
사용자에게 다시 묻거나, 기본값을 사용하거나, 계산을 포기할 수 있습니다: 컨텍스트를 가진 것은 호출 코드 뿐입니다.
처리의 위치
- 반응이 간단하고 국소적일 경우(메시지 출력, 기본값 사용, 사용자 재시도 요청 등) 예외를 발생 부근에서 처리하십시오.
- 결정이 프로그램의 더 큰 부분에 속할 경우(전체 거래 중단, 변경 사항 되돌림, 작동 실패 알림 등) 상위 수준에서 처리하십시오.
- 경험칙: 먼저 발견하는 수준이 아니라, 무엇을 할지 결정할 수 있는 정보가 충분한 수준에서 잡으십시오.
worked example: 해서는 안 되는 것
- 한 학생이 전체 프로그램 주변에
EXCEPT: (do nothing)을 placing하여 program이 절대 crash하지 않게 만듭니다. 이것이 나쁜 관행인 이유를 설명하십시오. - 예외가 **감지(Swallowed)**됩니다: 프로그램은 아무 일도 없었던 것처럼 계속运行하므로, 결손되거나 invalid 데이터로 진행하여 명백한 실패 대신 잘못된 결과를 산출합니다.
- silent failure는 crash보다 더 진단하기 어렵습니다. 메시지도 없고 어디에서 일어났는지 표시도 없기 때문입니다.
- 한 곳에서 모든 예외를 잡으면 특정 오류 유형까지 사라지므로 합리적인 반응을 선택할 수 없습니다. 핸들러는 특정 예외를 잡고 실제로对它 대응해야 합니다.
예외를 조용히 '삼키다'(catching but doing nothing)하면 실제 오류가 숨겨지고 디버깅이 어려워집니다 — 처리하거나 적어도 로그에 기록해야 합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
빈 핸들러는 찾아야 할 문제 그 자체를 숨깁니다; 항상 응답하거나 오류를 기록하십시오.
놓칠 수 있는 점
- 예외가 발생하면 TRY 블록의 나머지는 건너뜁니다. trace할 때 이를 명시하십시오.
- 모든 것이 아닌 첫 번째 매칭 EXCEPT만 실행됩니다.
- FINALLY는 항상 실행되며, 에러 유무와 상관없으며, 이것이 파일을 닫기에 적절한 이유입니다.
- 예외를 catch하고 아무것도 하지 마십시오. bad data로 continued execution하는 swallowed error는 crash보다 더 나쁩니다.
이해했습니다
- **예외(exception)**는 run-time error이며, 이를 handling하면 program이 crash하지 않고 respond할 수 있으며, 사전에 prevention할 수 없는 errors를 cover하며, normal code와 error handling을 **분리(separate)**합니다.
- TRY는 위험한 코드를 포함; 오류 시 나머지는 건너뛰고 first matching EXCEPT가 실행됨; FINALLY는 두 경우 모두 행되므로 cleanup은 여기에屬함
- response를 결정할 수 없는 subroutine은 its caller에게 RAISE해야 함
- 간단한 local response에는就近에서, 더 넓은 view가 필요한 decision에는 상위에서 처리; 결코 catch하고 아무것도 하지 말 것