예외처리 구문 덕분에 시스템 에러 대신 “오류가 발생했습니다”란 메시지가 출력되었다. 이처럼 PL/SQL 코드의 실행부에서 예외가 발생하는 즉시 이후 코드는 처리되지 않고 제어권은 예외처리 구문으로 넘어간다. 여기서 한 가지 질문! 어차피 시스템에서 예외를 잡아주는데 굳이 예외처리 구문을 넣을 필요가 있을까? 정답은 “넣어야 한다” 이다. 왜 그런지 다음 예제를 살펴 보자. 먼저 위의 익명 블록을 예외처리 부분이 있는 것과 없는 것으로 나누어 2개의 프로시저로 만들어 보자.
입력
CREATE OR REPLACE PROCEDURE ch10_no_exception_proc
IS
vi_num NUMBER := 0;
BEGIN
vi_num := 10 / 0;
DBMS_OUTPUT.PUT_LINE('Success!');
END;
결과
PROCEDURE CH10_NO_EXCEPTION_PROC이(가) 컴파일되었습니다.
입력
CREATE OR REPLACE PROCEDURE ch10_exception_proc
IS
vi_num NUMBER := 0;
BEGIN
vi_num := 10 / 0;
DBMS_OUTPUT.PUT_LINE('Success!');
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('오류가 발생했습니다');
END;
결과
PROCEDURE CH10_EXCEPTION_PROC이(가) 컴파일되었습니다.
먼저 예외처리가 없는 프로시저를 실행하는 익명 블록을 만들어 실행해 보자.
입력
DECLARE
vi_num NUMBER := 0;
BEGIN
ch10_no_exception_proc;
DBMS_OUTPUT.PUT_LINE('Success!');
END;
결과
ORA-01476: 제수가 0입니다.
이제 예외처리가 있는 프로시저를 실행하는 익명 블록을 만들고 실행해 보자.
입력
DECLARE
vi_num NUMBER := 0;
BEGIN
ch10_exception_proc;
DBMS_OUTPUT.PUT_LINE('Success!');
END;
결과
오류가 발생했습니다
Success!
어떤 차이점이 있는지 알겠는가? 예외처리가 없는 프로시저를 실행했더니 시스템에서 예외를 발생시켜 해당 프로시저 실행이 중단됐음은 물론 익명 블록에서 “Success!”를 출력하는 부분도 실행되지 않았다. 반면 예외처리가 구현된 프로시저를 실행했을 때는, 예외 처리부로 제어권이 넘어가 “오류가 발생했습니다”란 메시지를 출력한 다음 익명 블록의 “Success!”란 메시지도 출력되었다. 예외처리를 함으로써 개발자가 프로그램 제어권을 획득해 여러 단계에 걸쳐 수행되는 프로그램의 정상적 동작을 보장할 수 있었는데 반해, 예외처리를 하지 않으면 오류가 난 시점에 프로그램의 흐름이 끊어져 버린다. 따라서 아주 간단한 코드를 작성할 때 조차도 반드시 예외처리 구문을 넣도록 하자.