source: tests/exceptions/resume.cfa@ 0497b6ba

Last change on this file since 0497b6ba was 3bf9d10, checked in by Peter A. Buhr <pabuhr@…>, 2 years ago

change printf to sout

  • Property mode set to 100644
File size: 2.7 KB
Line 
1// Resumption Exception Tests
2
3#include <fstream.hfa>
4#include "except-io.hfa"
5
6exception yin {};
7exception yang {};
8exception zen {};
9
10vtable(yin) yin_vt;
11vtable(yang) yang_vt;
12vtable(zen) zen_vt;
13
14void in_void(void);
15
16int main(int argc, char * argv[]) {
17 yin a_yin = {&yin_vt};
18 yang a_yang = {&yang_vt};
19 zen a_zen = {&zen_vt};
20
21 // The simple throw catchResume test.
22 try {
23 loud_exit a = "simple try clause";
24 sout | "simple throw";
25 throwResume a_zen;
26 sout | "end of try clause";
27 } catchResume (zen * error) {
28 loud_exit a = "simple catch clause";
29 sout | "simple catch";
30 }
31 sout | nl;
32
33 // Throw catch-all test.
34 try {
35 throwResume a_zen;
36 } catchResume (exception_t * error) {
37 sout | "catch-all";
38 }
39 sout | nl;
40
41 // Don't catch if handler does not match exception.
42 try {
43 try {
44 throwResume a_yin;
45 } catchResume (zen *) {
46 sout | "caught yin as zen";
47 }
48 } catchResume (yang *) {
49 sout | "caught yin as yang";
50 } catchResume (yin *) {
51 sout | "caught yin as yin";
52 }
53 sout | nl;
54
55 // Test rethrowing an exception.
56 try {
57 try {
58 loud_exit a = "rethrow inner try";
59 sout | "rethrow inner try";
60 throwResume a_zen;
61 } catchResume (zen *) {
62 loud_exit a = "rethrowing catch clause";
63 sout | "caught throw, will rethrow";
64 throwResume;
65 }
66 } catchResume (zen *) {
67 loud_exit a = "rethrow catch clause";
68 sout | "caught rethrow";
69 }
70 sout | nl;
71
72 // Throw a different exception in a catch.
73 try {
74 try {
75 throwResume a_yin;
76 } catchResume (yin *) {
77 sout | "caught yin, will throw yang";
78 throwResume a_yang;
79 } catchResume (yang *) {
80 sout | "caught exception from same try";
81 }
82 } catchResume (yang *) {
83 sout | "caught yang";
84 }
85 sout | nl;
86
87 // Another throw in the catch does not interfere.
88 try {
89 try {
90 sout | "throwing first exception";
91 throwResume a_yin;
92 } catchResume (yin *) {
93 sout | "caught first exception";
94 try {
95 sout | "throwing second exception";
96 throwResume a_yang;
97 } catchResume (yang *) {
98 sout | "caught second exception";
99 }
100 throwResume;
101 }
102 } catchResume (yin *) {
103 sout | "recaught first exception";
104 } catchResume (yang *) {
105 sout | "caught second exception (bad location)";
106 }
107 sout | nl;
108
109 // Check successive operations.
110 try {
111 try {
112 throwResume a_zen;
113 throwResume a_zen;
114 } catchResume (zen *) {
115 sout | "inner catch";
116 }
117 throwResume a_zen;
118 } catchResume (zen *) {
119 sout | "outer catch";
120 }
121 sout | nl;
122
123 in_void();
124}
125
126// Do a throw and rethrow in a void function.
127void in_void(void) {
128 zen a_zen = {&zen_vt};
129 try {
130 try {
131 sout | "throw";
132 throwResume a_zen;
133 } catchResume (zen *) {
134 sout | "rethrow";
135 throwResume;
136 }
137 } catchResume (zen *) {
138 sout | "handle";
139 }
140}
Note: See TracBrowser for help on using the repository browser.