summaryrefslogtreecommitdiff
path: root/docs/collections/tutorial/handlingexceptions.html
blob: eee4d6c1980f7dcd1c6277f6c5ac1a751ea4e0ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Handling Exceptions</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Berkeley DB Collections Tutorial" />
    <link rel="up" href="BasicProgram.html" title="Chapter 2.  The Basic Program" />
    <link rel="prev" href="retrievingdatabaseitems.html" title="Retrieving Database Items" />
    <link rel="next" href="UsingSecondaries.html" title="Chapter 3.  Using Secondary Indices" />
  </head>
  <body>
    <div xmlns="" class="navheader">
      <div class="libver">
        <p>Library Version 12.1.6.1</p>
      </div>
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">
		Handling Exceptions
	</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="retrievingdatabaseitems.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 2. 
		The Basic Program
	</th>
          <td width="20%" align="right"> <a accesskey="n" href="UsingSecondaries.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="handlingexceptions"></a>
		Handling Exceptions
	</h2>
          </div>
        </div>
      </div>
      <p>
    Exception handling was illustrated previously in
            <a class="xref" href="implementingmain.html" title="Implementing the Main Program">
		Implementing the Main Program
	</a>
	and 
            <a class="xref" href="usingtransactions.html" title="Using Transactions">
		Using Transactions
	</a>
	exception handling in a DB Java Collections API application in
	more detail.
</p>
      <p>
    There are two exceptions that must be treated specially:
	
	<a class="ulink" href="../../java/com/sleepycat/db/RunRecoveryException.html" target="_top">RunRecoveryException</a>
	
	and 
    
    <span>
        <a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>.
    </span>
</p>
      <p>
    
    <a class="ulink" href="../../java/com/sleepycat/db/RunRecoveryException.html" target="_top">RunRecoveryException</a>
    
	is thrown when the only solution is to shut down the application
	and run recovery. All applications must catch this exception and
	follow the recovery procedure.
</p>
      <p>
    When 
    
    <a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>
    
    
	is thrown, the application should normally retry the operation. If
	a deadlock continues to occur for some maximum number of retries,
	the application should give up and try again later or take other
	corrective actions. The DB Java Collections API provides two APIs
	for transaction execution.
</p>
      <div class="itemizedlist">
        <ul type="disc">
          <li>
            <p>
            When using the 
            <a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html" target="_top">CurrentTransaction</a>
            
            class directly, the application must catch 
            
            <a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>
            
            
            and follow the procedure described previously.
        </p>
          </li>
          <li>
            <p>
            When using the 
            <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>
            
            class, retries are performed automatically and the application need
            only handle the case where the maximum number of retries has been
            reached. In that case, 
            <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html#run(com.sleepycat.collections.TransactionWorker)" target="_top">TransactionRunner.run</a>
            
            will throw 
            
            <span>
                <a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>.
            </span>
        </p>
          </li>
        </ul>
      </div>
      <p>
    When using the 
    <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>
    
	class there are two other considerations.
</p>
      <div class="itemizedlist">
        <ul type="disc">
          <li>
            <p>
            First, if the application-defined
            <a class="ulink" href="../../java/com/sleepycat/collections/TransactionWorker.html#doWork()" target="_top">TransactionWorker.doWork</a>
            
            method throws an exception the
            transaction will automatically be aborted, and otherwise the
            transaction will automatically be committed. Applications should
            design their transaction processing with this in mind.
        </p>
          </li>
          <li>
            <p>
            Second, please be aware that 
            <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html#run(com.sleepycat.collections.TransactionWorker)" target="_top">TransactionRunner.run</a>
            
            unwraps exceptions in order to discover whether a nested exception is a 
            
            <span>
                <a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>.
            </span>
            This is particularly important since all Berkeley DB exceptions
            that occur while calling a stored collection method are wrapped
            with a 
            <a class="ulink" href="../../java/com/sleepycat/util/RuntimeExceptionWrapper.html" target="_top">RuntimeExceptionWrapper</a>.
            This wrapping is necessary because Berkeley DB exceptions are
            checked exceptions, and the Java collections API does not allow
            such exceptions to be thrown.
        </p>
          </li>
        </ul>
      </div>
      <p>
    When calling 
    <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html#run(com.sleepycat.collections.TransactionWorker)" target="_top">TransactionRunner.run</a>,
	the unwrapped (nested) exception will be unwrapped and thrown
	automatically. If you are not using 
    <a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>
    
	or if you are handling exceptions directly for some other reason,
	use the 
    <a class="ulink" href="../../java/com/sleepycat/util/ExceptionUnwrapper.html#unwrap(java.lang.Exception)" target="_top">ExceptionUnwrapper.unwrap</a>
    
	method to get the nested exception. For example, this can be used
	to discover that an exception is a 
    
    <a class="ulink" href="../../java/com/sleepycat/db/RunRecoveryException.html" target="_top">RunRecoveryException</a>
    
	as shown below.
</p>
      <a id="cb_java_manageexceptions"></a>
      <pre class="programlisting"><strong class="userinput"><code>import com.sleepycat.db.RunRecoveryException;
import com.sleepycat.util.ExceptionUnwrapper;
...
    catch (Exception e)
    {
        e = ExceptionUnwrapper.unwrap(e);
        if (e instanceof RunRecoveryException)
        {
            // follow recovery procedure
        }
    }</code></strong> </pre>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="retrievingdatabaseitems.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="BasicProgram.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="UsingSecondaries.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">
		Retrieving Database Items
	 </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Chapter 3. 
		Using Secondary Indices
	</td>
        </tr>
      </table>
    </div>
  </body>
</html>