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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
|
(******************************************************************************
*
* Copyright (c) 1994-2000 Palm, Inc. or its subsidiaries.
* All rights reserved.
*
* File: ErrorBase.h
*
* Release: Palm OS SDK 4.0 (63220)
*
* Description:
* Include file for Error Management
*
* History:
* 10/25/94 RM Created by Ron Marianetti
* 10/09/98 Bob Fill in all macros, fix defns w/ do{}while(0)
* 08/05/99 kwk Added menuErrorClass from Gavin's Menu.c
* 05/10/00 kwk Added intlErrorClass.
* 08/24/00 SCL Added hwrErrorClass.
*
*-----------------------------------------------------------------------
* Exception Handling
*
* This unit implements an exception handling mechanism that is similar
* to "real" C++ Exceptions. Our Exceptions are untyped, and there
* must be one and only one Catch block for each Try block.
*
* Try/Catch Syntax:
*
* ErrTry {
* // Do something which may fail.
* // Call ErrThrow() to signal failure and force jump
* // to the following Catch block.
* }
*
* ErrCatch(inErr) {
* // Recover or cleanup after a failure in the above Try block.
* // "inErr" is an ExceptionCode identifying the reason
* // for the failure.
*
* // You may call Throw() if you want to jump out to
* // the next Catch block.
*
* // The code in this Catch block does not execute if
* // the above Try block completes without a Throw.
*
* } ErrEndCatch
*
* You must structure your code exactly as above. You can't have a
* ErrTry { } without a ErrCatch { } ErrEndCatch, or vice versa.
*
*
* ErrThrow
*
* To signal failure, call ErrThrow() from within a Try block. The
* Throw can occur anywhere in the Try block, even within functions
* called from the Try block. A ErrThrow() will jump execution to the
* start of the nearest Catch block, even across function calls.
* Destructors for stack-based objects which go out of scope as
* a result of the ErrThrow() are called.
*
* You can call ErrThrow() from within a Catch block to "rethrow"
* the exception to the next nearest Catch block.
*
*
* Exception Codes
*
* An ExceptionCode is a 32-bit number. You will normally use
* Pilot error codes, which are 16-bit numbers. This allows
* plently of room for defining codes for your own kinds of errors.
*
*
* Limitations
*
* Try/Catch and Throw are based on setjmp/longjmp. At the
* beginning of a Try block, setjmp saves the machine registers.
* Throw calls longjmp, which restores the registers and jumps
* to the beginning of the Catch block. Therefore, any changes
* in the Try block to variables stored in registers will not
* be retained when entering the Catch block.
*
* The solution is to declare variables that you want to use
* in both the Try and Catch blocks as "volatile". For example:
*
* volatile long x = 1; // Declare volatile local variable
* ErrTry {
* x = 100; // Set local variable in Try
* ErrThrow(-1);
* }
*
* ErrCatch(inErr) {
* if (x > 1) { // Use local variable in Catch
* SysBeep(1);
* }
* } ErrEndCatch
*
*****************************************************************************)
unit errorbase;
interface
uses palmos, coretraps;
// Max message length supported by ErrCustomAlert
const
errMaxMsgLength = 511;
(************************************************************
* Error Classes for each manager
*************************************************************)
errNone = $0000; // No error
memErrorClass = $0100; // Memory Manager
dmErrorClass = $0200; // Data Manager
serErrorClass = $0300; // Serial Manager
slkErrorClass = $0400; // Serial Link Manager
sysErrorClass = $0500; // System Manager
fplErrorClass = $0600; // Floating Point Library
flpErrorClass = $0680; // New Floating Point Library
evtErrorClass = $0700; // System Event Manager
sndErrorClass = $0800; // Sound Manager
almErrorClass = $0900; // Alarm Manager
timErrorClass = $0A00; // Time Manager
penErrorClass = $0B00; // Pen Manager
ftrErrorClass = $0C00; // Feature Manager
cmpErrorClass = $0D00; // Connection Manager (HotSync)
dlkErrorClass = $0E00; // Desktop Link Manager
padErrorClass = $0F00; // PAD Manager
grfErrorClass = $1000; // Graffiti Manager
mdmErrorClass = $1100; // Modem Manager
netErrorClass = $1200; // Net Library
htalErrorClass = $1300; // HTAL Library
inetErrorClass = $1400; // INet Library
exgErrorClass = $1500; // Exg Manager
fileErrorClass = $1600; // File Stream Manager
rfutErrorClass = $1700; // RFUT Library
txtErrorClass = $1800; // Text Manager
tsmErrorClass = $1900; // Text Services Library
webErrorClass = $1A00; // Web Library
secErrorClass = $1B00; // Security Library
emuErrorClass = $1C00; // Emulator Control Manager
flshErrorClass = $1D00; // Flash Manager
pwrErrorClass = $1E00; // Power Manager
cncErrorClass = $1F00; // Connection Manager (Serial Communication)
actvErrorClass = $2000; // Activation application
radioErrorClass = $2100; // Radio Manager (Library)
dispErrorClass = $2200; // Display Driver Errors.
bltErrorClass = $2300; // Blitter Driver Errors.
winErrorClass = $2400; // Window manager.
omErrorClass = $2500; // Overlay Manager
menuErrorClass = $2600; // Menu Manager
lz77ErrorClass = $2700; // Lz77 Library
smsErrorClass = $2800; // Sms Library
expErrorClass = $2900; // Expansion Manager and Slot Driver Library
vfsErrorClass = $2A00; // Virtual Filesystem Manager and Filesystem library
lmErrorClass = $2B00; // Locale Manager
intlErrorClass = $2C00; // International Manager
pdiErrorClass = $2D00; // PDI Library
attnErrorClass = $2E00; // Attention Manager
telErrorClass = $2F00; // Telephony Manager
hwrErrorClass = $3000; // Hardware Manager (HAL)
blthErrorClass = $3100; // Bluetooth Library Error Class
udaErrorClass = $3200; // UDA Manager Error Class
oemErrorClass = $7000; // OEM/Licensee errors (0x7000-0x7EFF shared among ALL partners)
errInfoClass = $7F00; // special class shows information w/o error code
appErrorClass = $8000; // Application-defined errors
(********************************************************************
* Try / Catch / Throw support
*
* ---------------------------------------------------------------------
* Exception Handler structure
*
* An ErrExceptionType object is created for each ErrTry & ErrCatch block.
* At any point in the program, there is a linked list of
* ErrExceptionType objects. GErrFirstException points to the
* most recently entered block. A ErrExceptionType blocks stores
* information about the state of the machine (register values)
* at the start of the Try block
********************************************************************)
type
ErrJumpBuf = array [0..12-1] of ^Integer; // D3-D7,PC,A2-A7
// Structure used to store Try state.
type
ErrExceptionPtr = ^ErrExceptionType;
ErrExceptionType = record
nextP: ErrExceptionPtr; // next exception type
state: ErrJumpBuf; // setjmp/longjmp storage
err: Int32; // Error code
end;
// Try & Catch macros
(*
#define ErrTry
{
ErrExceptionType _TryObject;
_TryObject.err = 0;
_TryObject.nextP = (ErrExceptionPtr)*ErrExceptionList();
*ErrExceptionList() = (MemPtr)&_TryObject;
if (ErrSetJump(_TryObject.state) == 0) {
*)
// NOTE: All variables referenced in and after the ErrCatch must
// be declared volatile. Here's how for variables and pointers:
// volatile UInt16 oldMode;
// ShlDBHdrTablePtr volatile hdrTabP = nil;
// If you have many local variables after the ErrCatch you may
// opt to put the ErrTry and ErrCatch in a separate enclosing function.
(*
#define ErrCatch(theErr)
*ErrExceptionList() = (MemPtr)_TryObject.nextP;
}
else {
Int32 theErr = _TryObject.err;
*ErrExceptionList() = (MemPtr)_TryObject.nextP;
*)
(*
#define ErrEndCatch
}
}
*)
(********************************************************************
* Error Manager Routines
********************************************************************)
//function ErrSetJump(buf: ErrJumpBuf): Int16; syscall sysTrapErrSetJump;
//procedure ErrLongJump(buf: ErrJumpBuf; result: Int16); syscall sysTrapErrLongJump;
function ErrExceptionList: MemPtrPtr; syscall sysTrapErrExceptionList;
procedure ErrThrow(err_: Int32); syscall sysTrapErrThrow;
procedure ErrDisplayFileLineMsg(const filename: PChar; lineNo: UInt16; const msg: PChar); syscall sysTrapErrDisplayFileLineMsg;
//---------------------------------------------------------------------
// 2/25/98 - New routine for PalmOS >3.0 to display a UI alert for
// run-time errors. This is most likely to be used by network applications
// that are likely to encounter run-time errors like can't find the server,
// network down, etc. etc.
//
// This routine will lookup the text associated with 'errCode' and display
// it in an alert. If errMsgP is not NULL, then that text will be used
// instead of the associated 'errCode' text. If 'preMsgP' or 'postMsgP'
// is not null, then that text will be pre-pended or post-pended
// respectively.
//
// Apps that don't use the extra parameters may want to just use the
// macro below 'ErrAlert'
//---------------------------------------------------------------------
function ErrAlertCustom(errCode: Err; errMsgP, preMsgP, postMsgP: PChar): UInt16; syscall sysTrapErrAlertCustom;
function ErrAlert(err: Err): UInt16;
implementation
function ErrAlert(err: Err): UInt16;
begin
ErrAlert := ErrAlertCustom(err, nil, nil, nil);
end;
end.
|