I wanted to pass a method to execute to a helper method that created a response on API requests. If the method succeeded, it should return it's result; if an exception was thrown, it should return a 500 with the error. This is what I came up with:
/// <summary> /// For methods that don't have a return value. /// </summary> protected HttpResponseMessage Respond(HttpRequestMessage request, Action method, HttpStatusCode errorStatusCode, string errorMessage) { try { method(); return request.CreateResponse(HttpStatusCode.OK); } catch { return request.CreateErrorResponse(errorStatusCode, errorMessage); } } /// <summary> /// For methods that do have a return value. /// </summary> protected HttpResponseMessage Respond(HttpRequestMessage request, Func method, HttpStatusCode errorStatusCode, string errorMessage) { try { return request.CreateResponse(HttpStatusCode.OK, method()); } catch { return request.CreateErrorResponse(errorStatusCode, errorMessage); } }
Now, I can respond to an API request in a single line:
return Respond(Request, () => Repo.Update(c), HttpStatusCode.InternalServerError, "Failed!");