76 lines
1.3 KiB
Plaintext
76 lines
1.3 KiB
Plaintext
![]() |
Before trapping all possible exceptions, it is best to try to trap the specific ones and try to recover from those.
|
||
|
|
||
|
== Noncompliant Code Example
|
||
|
|
||
|
----
|
||
|
SET SERVEROUTPUT ON
|
||
|
|
||
|
CREATE TABLE hitCounter
|
||
|
(
|
||
|
page VARCHAR2(42),
|
||
|
hits NUMBER,
|
||
|
CONSTRAINT pk PRIMARY KEY (page)
|
||
|
);
|
||
|
|
||
|
CREATE PROCEDURE hitPage(pageIn VARCHAR2) AS
|
||
|
BEGIN
|
||
|
INSERT INTO hitCounter VALUES (pageIn, 1);
|
||
|
EXCEPTION -- Noncompliant, the only exception handler is WHEN OTHERS
|
||
|
WHEN OTHERS THEN
|
||
|
IF SQLCODE = -1 THEN
|
||
|
UPDATE hitCounter SET hits = hits + 1 WHERE page = pageIn;
|
||
|
ELSE
|
||
|
DBMS_OUTPUT.PUT_LINE('An unknown error occured!');
|
||
|
END IF;
|
||
|
END;
|
||
|
/
|
||
|
|
||
|
BEGIN
|
||
|
hitPage('index.html');
|
||
|
hitPage('index.html');
|
||
|
END;
|
||
|
/
|
||
|
|
||
|
SELECT * FROM hitCounter;
|
||
|
|
||
|
DROP PROCEDURE hitPage;
|
||
|
DROP TABLE hitCounter;
|
||
|
----
|
||
|
|
||
|
== Compliant Solution
|
||
|
|
||
|
----
|
||
|
SET SERVEROUTPUT ON
|
||
|
|
||
|
CREATE TABLE hitCounter
|
||
|
(
|
||
|
page VARCHAR2(42),
|
||
|
hits NUMBER,
|
||
|
CONSTRAINT pk PRIMARY KEY (page)
|
||
|
);
|
||
|
|
||
|
CREATE PROCEDURE hitPage(pageIn VARCHAR2) AS
|
||
|
BEGIN
|
||
|
INSERT INTO hitCounter VALUES (pageIn, 1);
|
||
|
EXCEPTION
|
||
|
WHEN DUP_VAL_ON_INDEX THEN
|
||
|
UPDATE hitCounter SET hits = hits + 1 WHERE page = pageIn;
|
||
|
WHEN OTHERS THEN
|
||
|
DBMS_OUTPUT.PUT_LINE('An unknown error occured!');
|
||
|
END;
|
||
|
/
|
||
|
|
||
|
BEGIN
|
||
|
hitPage('index.html');
|
||
|
hitPage('index.html');
|
||
|
END;
|
||
|
/
|
||
|
|
||
|
SELECT * FROM hitCounter;
|
||
|
|
||
|
DROP PROCEDURE hitPage;
|
||
|
DROP TABLE hitCounter;
|
||
|
----
|
||
|
|
||
|
include::../see.adoc[]
|