Please read Part 1 of this post here.
But with the following code I can just do away with making change only to one place.
Class HandelException { function HandleError(Action success, Action <Exception> fail, Action final){ try{ sucess(); } catch(Exception e){ Log(e.Message); fail(); } finally{ final(); //Do some funky stuff here; } } } Class A { int i; int j; function Add(int arg1, int arg2) { //Comment: HandelException.HandleError(sucess,fail,final); HandelException.HandleError( () => {return arg1 + arg1;}, //success (e) => {RaiseException( "Addition Failed in Add()"); }, //fail () => {/* clean up code */} //final ) } function Sub(int arg1, int arg2) { () => {return arg1 - arg1;}, //success (e) => {RaiseException( "Addition Failed in Sub()"); }, //fail () => {/*clean up code*/} //final } }
See the magic here… we are not passing any parameters to the handler class.
- We just provide the function parameters that we might want to use in the consuming (Class A) class.
- We might want to use the exception (here -> e parameter for fail action) for propagating user friendly message to higher layers)
- Now Class A concentrates more on its given responsibility (do some Math work) than the other clattery codes. It’s easy to spot logic errors there.
- Let say if we want to audit log all the calls to methods. Just add a logger statement before and after sucess() in HandelException.HandleError -> Try Block that will do the trick.
Hope this serves the purpose of explaining the use of <actions>. There are more things to it will cover it some other time.
1 comment