Я создал ApplicationException в своем проекте asp.net. Идея состоит в том, что я использую это ApplicationExcpetion для создания исключений с правильным сообщением для пользователя и использую исключение для обработки общих и непредвиденных ошибок с помощью общего сообщения для пользователя.
public async Task<HttpResponseMessage> Get([FromUri]GetDto getDto)
{
try
{
var response = await _application.Get(getDto);
return Request.CreateResponse(HttpStatusCode.OK, response);
}
catch (ApplicationException ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
catch (Exception)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError,
"There was an error on the request.");
}
}
Проблема в том, что я создал класс CustomException, производный от ApplicationException, и когда он выбрасывается, он всегда останавливается на Exception catch, а не на ApplicationException catch, как я ожидал.
public class ApplicationException : Exception
{
public ApplicationException(string message) : base(message)
{
}
public ApplicationException(string message, Exception innerException)
: base(message, innerException)
{
}
}
public class CustomException: ApplicationException
{
private static readonly string MESSAGE = "customMessage";
public CustomException(): base(MESSAGE) { }
}
Есть ли что-то, что я делаю неправильно? Как правильно обращаться с такими исключениями, отделяя исключения таможенных приложений от остальных?
Да, но поскольку я перехватываю ApplicationExceptions до перехвата Exception, ошибка должна попасть в перехват ApplicationException, верно?
Вы не сами написали ApplicationException, не так ли? Есть System.ApplicationException...
Я не могу воспроизвести это. Как вы сказали, catch(SomeException) перехватывает все типы исключений, происходящие от SomeException. Так что похоже Филдор прав, вы ловите не твойApplicationException, а System.ApplicationException. (или что ошибка уже случилась при наследовании).
верно, как я уже писал в своем ответе, проблема в том, что уже существовало исключение System.ApplicationException. Я думаю, что другим решением было бы удалить мой класс ApplicationException и сделать de CustomException производным от этого System.ApplicationException, которое уже существует.





Я только что понял, что я делаю неправильно.
Уже существует класс ApplicationExcpetion в библиотеках C#. Уловка ApplicationException на моем контроллере искала исключение типа System.ApplicationException, за исключением класса ApplicationException, который я создал.
Мое решение состояло в том, чтобы просто переименовать ApplicationException в DomainException, и это сработало просто отлично :)
Одна вещь, которая явно неверна, заключается в том, что вы ловите экземпляр
Exceptionи записываете об этом ничего. Вы должны, по крайней мере, регистрировать детали для внутреннего использования, независимо от того, что вы возвращаете клиенту. Это также позволит вам, например, увидеть фактический тип исключения, чтобы вы могли проверить, действительно ли выCustomExceptionпопадаете сюда (я подозреваю, что это не так).