Friday, December 09, 2005
Filtering Exceptions
Some languages like VB.NET but not C# supports Exception Filters .
Let's take these quick scenarios :
1- procedure A which has an exception handler is calling Proc B which
doesn't have an exception handler. Proc B Throw an exception . What happens
? Of course the runtime will search the stack for any catch until it hits A.
so A cacth the exception
2- same as before but B has an exception handler . What happens ? Of course
B catch the exception which might in turn voluntarily throw the exception .
3-
Sub A
Try
B()
Catch when Filter1() = True
DoSomething()
End Try
End sub
Function Filter1() as boolean
return True
End function
Sub B
Try
DoWork()
Finally
FinalizeMyWork()
End Try
End sub
Sub DoWork()
throw new exception()
End sub
The question now is : what are the ordered steps of execution ?
1- A calls B
2- B calls DoWork()
3- DoWork throw an exception
4- CLR will search in the stack for a handler until it finds A's
Handler
5- this is the trick . Filter1 is executed
6- B's Finally
7- DoSomething
So here is the lesson : TAKE CARE , some code could run after the try and
before the Finally . In our case , from B's Perspective , DoWork() is
executed then (SHOULD) followed by FinalizeMyWork(). But in practical , NO the
filter is executed in between . For me it is like (not is) code injection .