Lambdas and anonymous delegates for Debugging
I was posed the problem a few weeks ago that someone has a coding project where the execution engine swallows all exceptions and unless explicitly catching all exceptions (he didn’t want to put a big try catch around everything in production code) there would be little or difficulty in finding if an exception had been thrown in one of his modules.
After some thought, I considered that by utilising anonymous delegates (Action and Func) he would be able to add testing to the existing code very easily, and utilize the Debug/Release modes within Visual Studio.
I proposed, unfortunately with out use of whiteboards or anything which would have been useful, to have within a test harness a helper method which took one of these anonymous delegates, and caught all exceptions and wrote them to Trace to allow him to view them after a test.
public static void ExceptionHelper(Action action)
{
try
{
action();
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
Within the main body of the test harness to add an
#if DEBUG
to allow him to easily swap between running with exceptions handled himself or to allow them to pass through to the execution engine.
public static void TestHarness()
{
Trace.Listeners.Add(new ConsoleTraceListener());
#if DEBUG
ExceptionHelper(FunctionToTest);
#else
FunctionToTest();
#endif
}
Now when Visual Studio runs the test harness in Debug mode, the exceptions will be caught, as the delegate points to the FunctionToTest method which is executed by the action(); line in ExceptionHelper. If the user is in Release mode (i.e. not in Debug) then the Function will be executed as normal.