필자가 작성한 스토어드 프로 시저가 있으며 어떤 유형의 예외로도 실패 할 경우 특정 방식으로 응답하고 싶지만 예외를 호출자에게 다시 전달하고 싶습니다. .오라클은 모든 예외를 관찰 하나 캡처는 수행하지 않음
어떻게하면됩니까? 당신이 그것을 포착 한 번
필자가 작성한 스토어드 프로 시저가 있으며 어떤 유형의 예외로도 실패 할 경우 특정 방식으로 응답하고 싶지만 예외를 호출자에게 다시 전달하고 싶습니다. .오라클은 모든 예외를 관찰 하나 캡처는 수행하지 않음
어떻게하면됩니까? 당신이 그것을 포착 한 번
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price/earnings INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ'; -- might cause division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
RAISE ; --This will reraise your exception
END; -- exception handlers and block end here
나는 당신의 질문을 이해하면 제대로, 당신은 단지 예외를 re-raise해야합니다. (예외 블록의 상기 참조; here으로부터 실시 예에 기초하여) 위의 링크
EDIT
: http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#1069
선택적 OTHERS 예외 핸들러, 어떤 블록 또는 서브 프로그램에서 항상 핸들러이며 exc의 핸들러 역할을합니다. eptions은 특별히 지정되지 않았습니다. 따라서 블록 또는 서브 프로그램은 하나의 OTHERS 핸들러 만 가질 수 있습니다 ( ).
EXCEPTION
WHEN ZERO_DIVIDE THEN
-- handle the error
WHEN NO_DATA_FOUND THEN
-- handle the error
WHEN OTHERS THEN
-- handle all other errors
END;
는
WHEN OTHERS
NULL ; --swallowing the exception, not propagating it, just ignoring it. This will be problematic!
END ;
그러나 당신을 ... 예를 들어 당신이 오류를 삼킬 아무것도
을하지 않는다하기 위해 언제 기타를 사용하지 않아야합니다, 기타를 사용하는주의 사항이 있습니다 이를 수행 할 수 있습니다 :
WHEN OTHERS
LOGException(...) ; /** look at the asktom link for his example **/
RAISE; --always follow up with a RAISE!
END ;
Have a look at asktom to see his views WHEN OTHERS!
그러나 예외를 호출하는 앱에 전달하려는 경우 캡쳐 할 필요가 없습니다. 그것을 포착하지 않으면 자동으로 거품이 날 것입니다.
특정 예외 대신 모두 캡처하는 방법은 무엇입니까? – Malfist
모든 예외를 포착하기 위해 편집했습니다. – Malfist
@Malfist, 'catch all'은 다른 것입니다 (위에 편집 한 것입니다) – Harrison