Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
210 / 132 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
1

Почему нельзя генерировать исключения некоторых типов из своего кода

09.08.2012, 11:29. Показов 1239. Ответов 5
Метки нет (Все метки)

MSDN говорит следующее:
Do not throw System.Exception, System.SystemException, System.NullReferenceException, or System.IndexOutOfRangeException intentionally from your own source code.
Я не могу понять почему. Кто нибудь знает ответ на этот вопрос?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2012, 11:29
Ответы с готовыми решениями:

Почему нельзя обрабатывать исключения в потоках
Сижу читаю msdn: http://msdn.microsoft.com/ru-ru/library/6kac2kdh.aspx Пять раз перечитал эти...

Почему в конструкторе QMAinQindow нельзя обрабатывать исключения
Вот написал код конструтора ChildWindow::ChildWindow(QWidget *par) : QMAinWindow(par) { ...

Почему на некоторых сайтах нельзя скопировать текст?
Почему на некоторых сайтах нельзя скопировать текст? Как это сделали? Название темы и вопрос...

Почему на некоторых темах стоях восклицательные знаки и на них нельзя ответить?
Почему на некоторых темах стоях восклицательные знаки и на них нельзя ответить?

5
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
09.08.2012, 16:46 2
Вероятно потому, что удобно отделять системные и пользовательские исключения, что бы бло ясно, что данное исключение принадлежит непосредственно фреймворку, а не пользовательскому коду.

И потом, при каком сценарии выполнения вы могли бы в своем коде бросать эти исключения?

Добавлено через 58 секунд
Например, System.NullReferenceException, возникает при обращении к null, вы не можете выполнить такое обращение, вы можете только попросить framework сделать это и тогда он сам бросит исключение, если это необходимо, тоже самое с IndexOutOfRangeException.
1
210 / 132 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
09.08.2012, 17:15  [ТС] 3
Цитата Сообщение от SandWraith Посмотреть сообщение
Вероятно потому, что удобно отделять системные и пользовательские исключения, что бы бло ясно, что данное исключение принадлежит непосредственно фреймворку, а не пользовательскому коду
Почему же тогда майкрософт рекомендует не использовать только некоторые системные исключения, а не все поголовно? Другие же исключения, которые тоже унаследованны от System.Exception он использовать не запрещает


Цитата Сообщение от SandWraith Посмотреть сообщение
Например, System.NullReferenceException, возникает при обращении к null
Например, в фреймворке полно разных методов, которые допускают в качестве параметра передавать null и при этом они не бросают Exception. А вдруг в моей некоторой задачи является недопустимым, чтобы в этот метод передавался null, и такое мне нужно предупредить зараннее перед вызовом метода. Тогда я могу сделать в своем коде:
C#
1
2
3
4
if(someVariable == null)
{
    throw new System.NullReferenceException();
}


Также можно найти применение для второго системного исключения, приведенного вами:
Например я создал какой-то новый контрол для Windows Forms, некоторое свойство которого может принимать числа только в диапазоне от 0 до 100. И если было передано число меньше за 0 или большее за 100, тогда я могу вызвать IndexOutOfRangeException

Кстати, живым примером такого контрола, который использует это исключение, является ProgressBar. Он выбрасывает исключение IndexOutOfRangeException, если свойству Value попытаться присвоить значение меньше 0 или больше 100

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


Короче, то что вы сказали, всеравно не дает мне аргументированный ответ, почему указанные исключения нельзя использовать в своем коде
0
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
09.08.2012, 17:33 4
Цитата Сообщение от Tolias28 Посмотреть сообщение
является недопустимым, чтобы в этот метод передавался null, и такое мне нужно предупредить зараннее перед вызовом метода. Тогда я могу сделать в своем коде:
Вам нужен InvalidArgumentException, потому что как вы правильно заметили проблема не в образении к null (вы не делаете этого обращения) - проблема в некорректном аргументе.


Цитата Сообщение от Tolias28 Посмотреть сообщение
за 0 или большее за 100, тогда я могу вызвать IndexOutOfRangeException
IndexOutOfRangeException говорит о попытке обращения, вы этой попытке не делаете (а если вы ее делаете, то и не волнуйтесь - фреймворк кинет исключение вместо вас), зачем тогда кидать это исключение? В этом случае вам опять неоходим ArgumentOutOfRangeException.


Цитата Сообщение от Tolias28 Посмотреть сообщение
Да и в книгах я частенько видел примерчики, где используется это исключение в пользовательском коде, когда введено значение, которое недопустимо в конкретной задачи и выходит из диапазона.
Вот: ArgumentException, ArgumentNullException, ArgumentOutOfRangeException.
1
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
09.08.2012, 18:01 5
Tolias28, причина - явное разделение нормальной работы приложения и багов в коде.
Выброс исключения зачастую - штатная или по крайней мере ожидаемая ситуация, но при возникновении некоторых исключений можно со 100% вероятностью сказать, что это - ошибка в разработке, а не штатная ситуация.
Вот вышеперечисленные исключения и возникают тогда, когда у вас явный косяк в коде - и вам дается об этом знать. Потому самому их кидать действительно не стоит.
Например, если у вас есть метод, в который передается ссылка на объект и вы хотите выбросить исключение, если эта ссылка null, то бросайте ArgumentNullException - это сразу даст понять человеку, использующему ваш класс, что вы ему явно говорите: не давай мне пустых ссылок.
Если же вы ему бросите NullReferenceException, то он скорее всего свяжется с вами, чтобы указать на баг в вашем методе.

В общем, некоторые исключения созданы для того, чтобы их бросала среда выполнения для указания ошибок в коде.
1
210 / 132 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
09.08.2012, 18:59  [ТС] 6
kolorotur и SandWraith, спасибо за развернутые ответы! Кажется до меня дошло...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2012, 18:59

Почему нельзя создать массив generic объектов с определёнными параметрами типов?
Почему нельзя создать массив generic объектов с определёнными параметрами типов? К примеру, почему...

Почему существует 2 ASC-кода некоторых символов?
Привет! Просвятите, пожалуйста, Asc("Ё") == 168 AscW("Ё") == 1025 и так для многих...

Как генерировать исключения?
Как сгенерировать исключение. Как выход индекса за пределы допустимого диапозона. Изучаю API

DateTimePicker как заставить не генерировать событие ValueChanged в некоторых случаях
Доброго времени, суток Господа. Подскажите пожалуйста, как заставить DateTimePicker не генерировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru