Manejo de excepciones personalizado en el servicio REST de ServiceStack

Tengo un servicio REST de ServiceStack y necesito implementar un manejo de errores personalizado. He podido personalizar los errores de servicio configurando AppHostBase.ServiceExceptionHandler en una función personalizada.

Sin embargo, para otros tipos de errores, como los errores de validación, esto no funciona. ¿Cómo puedo cubrir todos los casos?

En otras palabras, estoy tratando de lograr dos cosas:

  1. Establecer mis propios códigos de estado HTTP para cada tipo de excepción que pueda aparecer, incluidos los errores de no servicio (validación)
  2. Devolver mi propio objeto de error personalizado (no el estado de respuesta predeterminado) para cada tipo de error

¿Cómo haría para lograr esto?

El AppHostBase.ServiceExceptionHandler global AppHostBase.ServiceExceptionHandler solo maneja las excepciones del servicio . Para manejar las excepciones que ocurren fuera de los servicios, puede configurar el controlador global AppHostBase.ExceptionHandler , por ejemplo:

 public override void Configure(Container container) { //Handle Exceptions occurring in Services: this.ServiceExceptionHandler = (request, exception) => { //log your exceptions here ... //call default exception handler or prepare your own custom response return DtoUtils.HandleException(this, request, exception); }; //Handle Unhandled Exceptions occurring outside of Services, //Eg in Request binding or filters: this.ExceptionHandler = (req, res, operationName, ex) => { res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message)); res.EndServiceStackRequest(skipHeaders: true); }; } 

Para crear y serializar un DTO al flujo de respuesta en el ExceptionHandler que no es de servicio , deberá acceder y usar el serializador correcto para la solicitud de IAppHost.ContentTypeFilters .

Más detalles sobre está en la página wiki de manejo de errores .

Hice mejoras en la respuesta de @mythz .

 public override void Configure(Container container) { //Handle Exceptions occurring in Services: this.ServiceExceptionHandlers.Add((httpReq, request, exception) = > { //log your exceptions here ... //call default exception handler or prepare your own custom response return DtoUtils.CreateErrorResponse(request, exception); }); //Handle Unhandled Exceptions occurring outside of Services //Eg Exceptions during Request binding or in filters: this.UncaughtExceptionHandlers.Add((req, res, operationName, ex) = > { res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message)); #if !DEBUG var message = "An unexpected error occurred."; // Because we don't want to expose our internal information to the outside world. #else var message = ex.Message; #endif res.WriteErrorToResponse(req, req.ContentType, operationName, message, ex, ex.ToStatusCode()); // Because we don't want to return a 200 status code on an unhandled exception. }); }