I am looking to implement the callback pattern with error handling such that error is caught and pass to the callback code with the response. Since I am using .NET 3.5, I cant use Task (TAP) pattern which provides us with t.Result and t.Exception properties. I tried some googling for best practices and ended up with the Begin/End APM model. Since I dont want to block the main thread, I ignored this model.
So here is a list of design ideas I currently have. I would love to hear which approach is the best/popular way to implement the callback pattern
- Place the Exception instead the Result object directly. I didnt like this method very much since it changes the definition of Result object
void OperationNameAsync(Action<Result> callback) {..} void OperationCallback(Result result) { if (result.Exception != null) { // successful result } else { // exception handling } }
- Use two parameters in the callback - Result, Exception. I got this idea from Javascript callbacks.
void OperationNameAsync(Action<Result, Exception> callback) {..}
- Use a generic wrapper object say Response which contains Result & Exception. Trying to mimic what Task object achieves.
class Response { T Result; Exception Exception; } void OperationNameAsync(Action<Response<Result>> callback) {..}
- Use separate callbacks for OnError and OnSuccess
void OperationNameAsync(Action<Response> onSuccessCallback, Action<Exception> onErrorCallback) {..}