2013-05-11 5 views
3

У меня есть класс CustomException, то есть обертка поверх Exception класса. Это основной класс, который я использую, когда обрабатываю исключения.Исключение, которое выбрасывает другое исключение

public class CustomException : Exception 
{ 
    public string ErrorMessage { get; private set; } 
    public HttpStatusCode HttpStatusCode { get; private set; } 

    public CustomException(string errorMessage) 
     : this(errorMessage, HttpStatusCode.InternalServerError) 
    { } 

    public CustomException(string message, HttpStatusCode httpStatusCode) 
    { 
     ErrorMessage = message; 
     HttpStatusCode = httpStatusCode; 
    } 
} 

Когда я хочу бросить исключение, я использую throw CustomException() метод.

Однако я хочу, чтобы создать некоторые обертки поверх этого CustomException(), а также, например:

public class ApplicationNotFoundException : Exception 
{ 
    public ApplicationNotFoundException(Application application) 
    { 
     string message = string.Format(@"Application ""{0}"" was not found", application.ApplicationName); 
     throw new CustomException(message, HttpStatusCode.NotFound); 
    } 
} 

И я бросить исключение линии это: throw new ApplicationNotFoundException(application)

В основном я бросаю исключение, из другого Исключения.

Этот подход плохой?

ответ

2

Это в основном не подход к использованию exceptions.
Создание пользовательских exceptions выполняет ваши собственные потребности, если встроенные исключения не могут справиться с этим.
Есть несколько способов для вас:

  1. Создать иерархию исключений, где CustomException ваш «базовый» класс и ApplicationNotFoundException является производным один, это предпочтительный способ специализировать.

или

  1. Вставить информацию, которая вам нужна в пользовательских исключений классы (создание небольших struct сек, если вы просто хотите, чтобы отправить информацию и не должны работать на конкретных объектах сами)

EDIT

Кроме того, что очень важно, считают stack unwinding как фактор эффективности. Бросание исключения заставляет стеки вызовов разматываться, что тоже занимает немного времени!

Вы можете сделать это своим путем, конечно, но это может немного подтянуть вещи, что может быть ненужным.

Для некоторого фона рассмотрим MSDN.

+0

+1, ApplicationNotFoundException должно выводиться из CustomException –

+0

@ bash.d: Единственным недостатком, вызывающим 'ApplicationNotFoundException', вытекающим из' CustomException', является что я не могу создать текст исключения внутри тела конструктора 'ApplicationNotFoundException' – Catalin

+0

@RaraituL Вы не можете? Почему нет?? –

2

Позвольте пользователю вашего ApplicationNotFoundException решить, когда это необходимо.
Не делайте этого в конструкторе вашего ApplicationNotFoundException.

Вместо получения вашего ApplicationNotFoundException из CustomException

public class ApplicationNotFoundException : CustomException 
{ 
    public ApplicationNotFoundException(Application application) 
    { 
     string message = string.Format(@"Application '{0}' was not found", application.ApplicationName); 
     base.ErrorMessage = message 
     base.HttpStatusCode = HttpStatusCode.NotFound; 
    } 
} 

public class CustomException : Exception 
{ 
    public string ErrorMessage { get; internal set; } 
    public HttpStatusCode HttpStatusCode { get; internal set; } 

    public CustomException(string errorMessage) 
     : this(errorMessage, HttpStatusCode.InternalServerError) 
    { } 

    public CustomException(string message, HttpStatusCode httpStatusCode) 
    { 
     ErrorMessage = message; 
     HttpStatusCode = httpStatusCode; 
    } 
} 
+0

Это значит, что я сначала инициализирую класс 'ApplicationNotFoundException', а затем его выброшу? – Catalin

+0

Да, когда вам нужно выбросить исключение, вы вызываете 'throw new ApplicationException (appInstance);' – Steve

1

Общий сценарий является Rethrow вашего более конкретного типа исключения, а в блоке поймать, чем в конструкторе:

try { 
    ... // Try to find application 
} 
catch(ApplicationNotFoundException ex) { 
    var message = ...; 
    throw new CustomException(message, HttpStatusCode.NotFound); 
} 

Когда Повторное выбрасывание другого исключения, вы можете установить свойство Inner-с оригинальным исключением для облегчения отладки.

Смежные вопросы