The Normal Try Statement is an Algol Statement which executes a sequence of statements until one is found which does not cause an exception.
The compiler pushes a a Try Fault Marker on the Stack, and then a PCW to the next Else part of the statement. If a fault occurs in the Try part, the MCP traps the fault and branches to the next Else part.
The next Else part starts by deleting the PCW and replacing it with a new PCW to the following Else part, and then it branches to the start of the code for the current Else part.
This pattern is repeated through the Else parts. The final Else part is not protected, and should a fault occur, then normal fault handling is performed.
At the end of the Try Statement, the two Stack Cells for the Try Fault Marker and the PCW are deleted.
This cod was emitted by the Algol Compiler.
Try
J:=A[I]
0003:0001:0 LT48 BE
0003:0002 000000080001
0003:0003:0 LT8 4 B204
0003:0003:2 STAG 95B4
0003:0003:4 MPCW BF
0003:0004:0 0003:0009:2 00040090A003
0003:0005:0 VALC (02,0002) 1002
0003:0005:2 NAMC (02,0004) 5004
Else
0003:0005:4 NXLV AD
0003:0005:5 NTGR 87
0003:0006:0 NAMC (02,0003) 5003
0003:0006:2 STOD B8
0003:0006:3 BRUN 000E:4 A2800E
Begin I:=1; J:=A[I]; End
0003:0007:0 ONE B1
0003:0007:1 NAMC (02,0002) 5002
0003:0007:3 STOD B8
0003:0007:3 STON B9
0003:0007:4 NAMC (02,0004) 5004
0003:0008:0 NXLV AD
0003:0008:1 NTGR 87
0003:0008:2 NAMC (02,0003) 5003
0003:0008:4 STOD B8
Else
0003:0008:5 BRUN 000E:4 A2800E
0003:0009:2 DLET B5
0003:0009:3 MPCW BF
0003:000A:0 0003:000D:5 000A00D0A003
0003:000B:0 BRUN 0007:0 A20007
Begin I:=0; J:=A[I]; End;
0003:000B:3 ZERO B0
0003:000B:4 NAMC (02,0002) 5002
0003:000C:0 STOD B8
0003:000C:0 STON B9
0003:000C:1 NAMC (02,0004) 5004
0003:000C:3 NXLV AD
0003:000C:4 NTGR 87
0003:000C:5 NAMC (02,0003) 5003
0003:000D:1 STOD B8
0003:000D:2 BRUN 000F:0 A2000F
0003:000D:5 DLET B5
0003:000E:0 DLET B5
0003:000E:1 BRUN 000B:3 A2600B
0003:0006:3 DBUN-LINK 0009:2 AA0038
0003:000E:4 DLET B5
0003:000E:5 DLET B5
The layout of the Try Fault Marker is defined in the MCP at 24606416,
| Tag 4 - Fault Marker | ||
|---|---|---|
| Field | Name | Description |
| [19:3] | FaultMarkF | FaultTryMarkV = 4 |
| [4:1] | TryInvalidF | If set, the Try word is invalid. |
| [3:1] | TryAllF | If set, this Try word protects from All faults |
| [2:3] | TryTypeF | The Type of Try Word, 1 = TryNormalV (Try Normal, GoTo PCW) 2 = TryExitV (Try Limited Error Procedure) 3 = TryReturnV (Try Limited Error Function Value) |
This is the Stack dump from the Try statement,
***************BOUNDS ERROR ************************************************** 0022 7 6000B0 201D50 RCW: ASD=00EA83, LL=2, Normal state [User segment @ 0003:0005:4 (00106000)] Segment Descriptor: C 680000 001D50 ------ BLOCK#1 Code: 3 000000 080001 3 B20495 B4BFFF 3 000400 90A003 >3 100250 04AD87< 3 5003B8 A2800E 0021 -----D[1]=>3 001200 090000 *ENVW: D[0] @ 0009 in the MCP 0020 1 0AC500 150000 *HISW: Previous HISW @ 0015 001F (02,0009) 9 800000 000042 FCW 001E (02,0008) 0 000000 000002 Op: Dec: 2 001D (02,0007) 7 600128 201D50 PCW: ASD=00EA83, LL=2, Segment @ 0003:0009:2, Normal state 001C (02,0006) 4 000000 080001 TRY WORD, Normal Type 001B (02,0005) 6 800000 000800 SCW: Blockexit marker: Single-dim Arrays
See also the Limited Try Statement and the Try Expression.