예외 (Exception) 발생 및 처리
이 단계에서는 런타임 오류, 즉 예외를 처리하는 방법을 배웁니다. 처리되지 않은 예외는 함수를 즉시 종료시킵니다. 먼저 실패하는 함수를 생성한 다음, 예외를 우아하게 처리하도록 수정합니다.
정수 나눗셈을 수행하는 simple_divide 함수를 만들어 보겠습니다. 이 함수에는 잠재적인 결함이 있습니다. 0 으로 나누려고 하면 충돌합니다.
CREATE OR REPLACE FUNCTION simple_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
END;
$$ LANGUAGE plpgsql;
먼저 유효한 입력으로 함수를 호출하여 올바르게 작동하는지 확인합니다.
SELECT simple_divide(10, 2);
출력은 나눗셈 결과입니다.
simple_divide
---------------
5
(1 row)
이제 0 으로 나누는 인수로 함수를 호출하여 예외를 발생시킵니다.
SELECT simple_divide(10, 0);
이 명령은 실패하고 오류 메시지를 반환합니다. 함수 실행이 중단됩니다.
ERROR: division by zero
CONTEXT: PL/pgSQL function simple_divide(integer,integer) line 3 at RETURN
이것은 처리되지 않은 예외입니다. 함수가 충돌하는 것을 방지하려면 EXCEPTION 블록을 사용할 수 있습니다. 오류 처리를 포함하는 새 함수 safe_divide를 만들어 보겠습니다.
CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'Error: Cannot divide by zero.';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
EXCEPTION 블록은 다음과 같이 작동합니다.
BEGIN...END;: 코드 블록을 정의합니다.
EXCEPTION: 이 키워드는 예외 처리 섹션을 시작합니다.
WHEN division_by_zero THEN: division_by_zero 오류가 발생할 때만 다음 코드가 실행되도록 지정합니다.
- 핸들러 안의 코드는 알림을 발생시키고 충돌하는 대신
NULL을 반환합니다.
이제 새 safe_divide 함수를 0 으로 나누는 인수로 호출합니다.
SELECT safe_divide(10, 0);
이번에는 함수가 충돌하지 않습니다. 예외를 처리하고 사용자 지정 알림을 표시하며 NULL을 반환합니다.
NOTICE: Error: Cannot divide by zero.
safe_divide
-------------
(1 row)
특정 예외를 성공적으로 처리하고 함수의 출력을 제어했습니다.