Added a CLEANUP mechanism to the exception handling library. Fixed a bug in the way setjmp() return codes were being handled that lead to infinite loops in some cases, exceptions getting missed in others. Made FINALLY {} a required element (unfortunately).
This commit is contained in:
@@ -4,10 +4,12 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW(2, NULL);
|
||||
} EXCEPT {
|
||||
} CATCH_GROUP(1) {
|
||||
} CATCH_GROUP(2) {
|
||||
} CATCH_GROUP(3) {
|
||||
EXCLIB_TRACE("Inside of CATCH_GROUP");
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
36
demo/cleanup.c
Normal file
36
demo/cleanup.c
Normal file
@@ -0,0 +1,36 @@
|
||||
#include "exclib.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int val = 512;
|
||||
int *ptr = &val;
|
||||
|
||||
TRY {
|
||||
THROW(3, "Checking to ensure cleanup behavior executes before EXCEPT block");
|
||||
} CLEANUP {
|
||||
ptr = NULL;
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
if ( ptr != NULL ) {
|
||||
EXCLIB_TRACE("pointer was not reset to NULL in first CLEANUP block");
|
||||
return 1;
|
||||
}
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
ptr = &val;
|
||||
TRY {
|
||||
/* No exception thrown here, CLEANUP should still execute */
|
||||
} CLEANUP {
|
||||
ptr = NULL;
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
if ( ptr != NULL ) {
|
||||
EXCLIB_TRACE("pointer was not reset to NULL in first TRY block");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -6,8 +6,17 @@ int main(void)
|
||||
TRY {
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -5,8 +5,12 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW(2, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} DEFAULT {
|
||||
EXCLIB_TRACE("Inside of DEFAULT - I catch everything!");
|
||||
return 0;
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -5,8 +5,9 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW(2, NULL);
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
printf("I am in the finally clause, and I am about to issue an unhandled exception error.\n");
|
||||
printf("I am in the finally clause, and I am about to issue an unhandled exception error.\n");
|
||||
} ETRY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4,10 +4,13 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW_ZERO(NULL, EXC_NULLPOINTER, "I just threw with THROW_ZERO");
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} CATCH ( EXC_NULLPOINTER ) {
|
||||
THROW_NONZERO(strcmp("not", "equal"),
|
||||
3,
|
||||
"strcmp was nonzero!");
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -12,8 +12,11 @@ int main(void)
|
||||
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
EXCLIB_TRACE("Caught 3");
|
||||
EXCLIB_TRACE("Caught 3");
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
EXCLIB_TRACE("Exiting program");
|
||||
|
||||
10
demo/skeleton.c
Normal file
10
demo/skeleton.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "exclib.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
TRY {
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
}
|
||||
@@ -5,11 +5,15 @@ int main(void)
|
||||
TRY {
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} EXCEPT {
|
||||
} CATCH(5) {
|
||||
EXCLIB_TRACE("Caught 5");
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
EXCLIB_TRACE("Caught 3");
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -4,15 +4,24 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} ETRY;
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
EXCLIB_TRACE("Should never get here");
|
||||
|
||||
@@ -10,8 +10,11 @@ int main(void)
|
||||
{
|
||||
TRY {
|
||||
THROW(3, NULL);
|
||||
} CLEANUP {
|
||||
} EXCEPT {
|
||||
} CATCH(3) {
|
||||
THROW(3, NULL);
|
||||
THROW(3, NULL);
|
||||
} FINALLY {
|
||||
} ETRY;
|
||||
|
||||
EXCLIB_TRACE("Should never get here");
|
||||
|
||||
Reference in New Issue
Block a user