Skip to content

Commit 7e5f26f

Browse files
author
Steven Feuerstein
authored
Create backtrace-to-error.pls
1 parent d80c3ee commit 7e5f26f

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/*
2+
Back Trace Exception to Line That Raised It
3+
4+
The DBMS_UTILITY.format_error_backtrace function, added in Oracle Database 10g Release 2,
5+
is a critical subprogram to call when logging exceptions. It returns a string that traces the error
6+
back to the line on which it was raised! Note: if you re-raise an exception as it propagates up the stack,
7+
you will lose the "original" line number. The back trace function always only traces back to the most recently raised exception.
8+
9+
LiveSQL Link: https://livesql.oracle.com/apex/livesql/file/content_CSBE3ZJTSXBTUEI174J84WGO0.html
10+
11+
*/
12+
13+
CREATE OR REPLACE PROCEDURE proc1
14+
IS
15+
BEGIN
16+
DBMS_OUTPUT.put_line ('running proc1');
17+
RAISE NO_DATA_FOUND;
18+
END;
19+
/
20+
21+
CREATE OR REPLACE PROCEDURE proc2
22+
IS
23+
l_str VARCHAR2 (30) := 'calling proc1';
24+
BEGIN
25+
DBMS_OUTPUT.put_line (l_str);
26+
proc1;
27+
END;
28+
/
29+
30+
CREATE OR REPLACE PROCEDURE proc3
31+
IS
32+
BEGIN
33+
DBMS_OUTPUT.put_line ('calling proc2');
34+
proc2;
35+
END;
36+
/
37+
38+
BEGIN
39+
DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1 unhandled');
40+
proc3;
41+
END;
42+
/
43+
44+
BEGIN
45+
DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1 unhandled');
46+
proc3;
47+
EXCEPTION
48+
WHEN OTHERS
49+
THEN
50+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
51+
END;
52+
/
53+
54+
CREATE OR REPLACE PROCEDURE proc3
55+
IS
56+
BEGIN
57+
DBMS_OUTPUT.put_line ('calling proc2');
58+
proc2;
59+
EXCEPTION
60+
WHEN OTHERS
61+
THEN
62+
DBMS_OUTPUT.put_line ('Error backtrace at top level:');
63+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
64+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
65+
END;
66+
/
67+
68+
BEGIN
69+
DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1 backtrace');
70+
proc3;
71+
END;
72+
/
73+
74+
CREATE OR REPLACE PROCEDURE proc1
75+
IS
76+
BEGIN
77+
DBMS_OUTPUT.put_line ('running proc1');
78+
RAISE NO_DATA_FOUND;
79+
EXCEPTION
80+
WHEN OTHERS
81+
THEN
82+
DBMS_OUTPUT.put_line ('Error backtrace in block where raised:');
83+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
84+
RAISE;
85+
END;
86+
/
87+
88+
CREATE OR REPLACE PROCEDURE proc3
89+
IS
90+
BEGIN
91+
DBMS_OUTPUT.put_line ('calling proc2');
92+
proc2;
93+
EXCEPTION
94+
WHEN OTHERS
95+
THEN
96+
DBMS_OUTPUT.put_line ('Error backtrace at top level:');
97+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
98+
END;
99+
/
100+
101+
BEGIN
102+
DBMS_OUTPUT.put_line ('Proc3 -> Proc2 -> Proc1, re-reraise in Proc1');
103+
proc3;
104+
END;
105+
/
106+
107+
CREATE OR REPLACE PROCEDURE proc1
108+
IS
109+
BEGIN
110+
DBMS_OUTPUT.put_line ('running proc1');
111+
RAISE NO_DATA_FOUND;
112+
EXCEPTION
113+
WHEN OTHERS
114+
THEN
115+
DBMS_OUTPUT.put_line ('Error stack in block where raised:');
116+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
117+
RAISE;
118+
END;
119+
/
120+
121+
CREATE OR REPLACE PROCEDURE proc2
122+
IS
123+
BEGIN
124+
DBMS_OUTPUT.put_line ('calling proc1');
125+
proc1;
126+
EXCEPTION
127+
WHEN OTHERS
128+
THEN
129+
RAISE VALUE_ERROR;
130+
END;
131+
/
132+
133+
CREATE OR REPLACE PROCEDURE proc3
134+
IS
135+
BEGIN
136+
DBMS_OUTPUT.put_line ('calling proc2');
137+
proc2;
138+
EXCEPTION
139+
WHEN OTHERS
140+
THEN
141+
DBMS_OUTPUT.put_line ('Error backtrace at top level:');
142+
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
143+
END;
144+
/
145+
146+
BEGIN
147+
DBMS_OUTPUT.put_line
148+
('Proc3 -> Proc2 -> Proc1, re-reraise in Proc1, raise VE in Proc2');
149+
proc3;
150+
END;
151+
/

0 commit comments

Comments
 (0)