Лучше обнаруживать исключения и бросать их или просто позволить среде выполнения бросать их? - PullRequest
3 голосов
/ 02 апреля 2012

Допустим, есть такая настройка:

public class MyClass
{
    public void DoSomething(string Data)
    {
      //if (String.IsNullOrWhiteSpace(Data))
        //throw new NullReferenceException();

      //Do something with Data and let it throw??
    }
}


public class EntryPointClass
{
  public void DoIt(string Data)
  {
     var logicClass = new MyClass();

     try
     {
        logicClass.DoSomething(Data);
     }
     catch(Exception ex)
     {

     }
  }
}

В DoSomething я могу обнаружить проблему и выдать исключение.При тестировании EntryPointClass я могу протестировать ожидаемый результат или проверить, что что-то произошло в улове.

Почему лучше генерировать исключение, а не просто ждать, пока оно произойдет?В любом случае, мы поймали это!

Ответы [ 6 ]

4 голосов
/ 02 апреля 2012

Вы делаете оба:

public void DoSomething(string Data)
{
  if (String.IsNullOrWhiteSpace(Data))
    //throw new NullReferenceException();  
    throw new ArgumentException("Data");


  //Do something with Data and let it throw??
}

Цель состоит в том, чтобы бросить пораньше и предоставить конкретную информацию.
Прямая причина броска заключается в том, что контракт с DoSomething() нарушен.Подайте сигнал, не ждите, пока DoSomething () продолжит и нарушит другие контракты.

Сбой быстро, сбой рано.

1 голос
/ 02 апреля 2012

Создайте свои собственные исключения, чтобы не видеть извне фактический источник исключения и, следовательно, иметь информацию о вашей реализации.

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

0 голосов
/ 02 апреля 2012

У Эрика Липперта есть отличная статья об исключении.

Пожалуйста, перейдите по ссылке.Это очень хороший ресурс о том, как следует обрабатывать исключения.

Как правило, старайтесь избегать исключений, а не пытаться обработать исключение.И не поймать все исключения.Я вижу Catch(Exception ex) в вашем коде.Поймай исключение, с которым ты можешь справиться.Вы ничего не можете сделать, когда получите OutofMemoryException, ThreadAbortException

Я согласен с Henk Holterman.

0 голосов
/ 02 апреля 2012

Один набор обстоятельств, когда вы не должны пытаться обнаружить состояние ошибки заранее, а не просто позволить сбою кода, - это когда есть зависимость от внешнего ресурса, вне вашей контроль кода. Например. все, что связано с сетью, файловой системой и т. д.

Проблема с любым из них заключается в том, что проверочный код может быть успешным, и тогда фактическая операция может все еще завершиться неудачей. Все, что вы сделали, добавив проверочный код, это увеличили объем написанного вами кода - вам все равно придется писать код для устранения реальных сбоев в любом случае .

0 голосов
/ 02 апреля 2012

Думайте об исключении как о человеке, который выпрыгивает из горящего дома и зовет на помощь: вы не хотите, чтобы они напугали население, но вы хотите, чтобы они уведомляли правильных людей, чтобы они что-то сделали с огнем.Имея это в виду:

1) Если у вас что-то не так в DoSomething и вы знаете, как это исправить - вам не нужно исключение: просто исправьте это внутри DoSomething.

2) ЕслиУ DoSomething проблемы с обработкой проблемы (неправильный атрибут, недоступные ресурсы и т. Д.) - используйте исключение, чтобы ESCALATE проблему и обработайте ее на уровне, где такая обработка возможна.

3) Если DoSomething ввернутспособ, на который вы никак не можете повлиять (например, сбой файловой системы и исключения ввода-вывода везде) - просто перехватите исключение, зарегистрируйте его и корректно завершите работу - по крайней мере, такая ситуация не будет выглядеть как взрыв.

0 голосов
/ 02 апреля 2012

Смысл использования Exception обработка , заключается в обработке исключений, которые могут быть вне вашего контроля.Если вы планируете обернуть свой код в блок try-catch, за исключением NullReferenceException , то у вас должно быть что-то для обработки этого типа исключения и выполнения любых необходимых операций, связанных с этой ошибкой..

При этом в ситуациях, когда вы знаете, что у вас может быть ошибка, которая может вызвать исключение, лучше проверить эту ситуацию - и вообще не выдавать ошибку, ноизящно справиться с этим.В противном случае вы просто кодируете по исключению, что является анти-паттерном.

Помните, что исключения - это именно исключения, исключения из ваших правил, а не универсальное решение для всего, что может пойти не так при выполненииваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...