2012-04-17 2 views
2

У меня есть класс 'b', который наследуется от класса 'a'. В классе «a» есть код, который выполняет действие, если событие не равно null. Мне нужен этот код для запуска в классе 'b' в течение определенного времени в приложении. Поэтому в 'b' я подписался на нового обработчика (событие).Что делает «throw new NotImplementedException();» сделать точно?

Если я оставил автогенерированное событие «как есть» в классе «b» с линией throw new NotImplementedException();, код работает/работает, как ожидалось. Как только я удалю исключение thow, приложение перестает работать так, как ожидалось.

Итак, что же делает throw new NotImplementedException, делая исключение?

Я понимаю, что, вероятно, на данный момент я пытаюсь решить проблему кодирования неправильно, и я уверен, что найду лучший способ сделать это (я все еще изучаю), но мой вопрос остается. Почему эта строка меняет исход кода?

EDIT: Я реанимирую, что не очень подробно с моим кодом. К сожалению, из-за строгих политик я не могу быть. У меня есть в классе 'a' выражение if.

if (someEvent != null) 

Когда код «работает», оператор if возвращает true. Когда он работает не так, как ожидается, он возвращает «false». В классе «b», единственный раз, когда приложение «работает» (или оператор if возвращает true), это когда у меня есть строка throw new NotImplementedException(); в методе событий класса «b», которая автоматически генерируется при присоединении нового события.

+6

Впервые я заметил, что кто-то спрашивает, почему ** удаление ** исключение вызывает нежелательное поведение;) –

+0

«больше не работает должным образом»: что вы ожидаете, и что происходит вместо этого? – phoog

+2

Это звучит как самый неприятный менеджер проектов когда-либо ... «Тим, закончили ли вы еще не реализовать эту функцию?» –

ответ

3

Это просто исключение, так как это означает, что ваше приложение «работает» полностью зависит от кода, обрабатывающего любые исключения.

Это не «специальное» исключение, а не нормальное исключение (отличное от Exception, как и все остальные). Вы склонны видеть это с генерированием кода в качестве заполнителя для реализации члена, который он бросает внутрь. Это намного проще сделать, чем генерировать код, чтобы понять структуру членов, чтобы вывести компилирующий код.

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

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

Полная догадка.

Если есть код в a, что вам нужно использовать в b, рассмотреть возможность сделать метод, где находится код protected и необязательно virtual, если вам нужно override поведения.

+0

Хорошая точка в отношении возвращаемого значения - эта возможность мне не приходила, но здесь мы говорим о обработчике событий, который будет «методом void». – phoog

+1

@phoog Правда, но вместо каких-либо фактических фактов/кода, показывающих проблему, я могу догадаться, как дико, как;;) –

6

Подумайте об этом: что делать, если вы хотите добавить два целых числа со следующим методом ...

private int Add(int x, int y) 
{ 

} 

... и нет кода внутри, чтобы сделать такой (метод, даже не возвращать целое число). Для этого используется NotImplementedException.

+1

awesome example ... :) – saun4frsh

2

NotImplementedException - способ заявить, что конкретный метод interface или базы class просто не реализован в вашем типе. Это форма исключения кода ошибки E_NOTIMPL.

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

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

+0

Для объекта, который реализует интерфейс, но не предоставляет поведение для данного члена интерфейса, не является более обычным бросать 'NotSupportedException'? – phoog

+0

@phoog 'NotSupportedException' обычно зарезервирован для случаев, когда интерфейс имеет свойство, определяющее, действительно ли метод на интерфейсе. Например, если 'ICollection .IsReadOnly' является истинным, тогда' ICollection .Add' должен бросать 'NotSupportedException'. «NotImplementedException» предназначен только тогда, когда метод просто не реализован. Напишите сообщение в блоге на разнице времени назад http://blogs.msdn.com/b/jaredpar/archive/2008/12/12/notimplementedexception-vs-notsupportedexception.aspx – JaredPar

0

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

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

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