Создание пользовательского исключения С#

Подскажите, пожалуйста, как создать пользовательское исключение. Я написала код.

VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadLine());

Мы открываем файл и там должна находится строка, которая будет означать количество вершин фигуры и потом переводим это значение в тип int. Если такой строки нет, то нужно выдать исключение " В файле не указано количество вершин. Файл не может быть обработан").

Я пробовала многими методами, но у меня постоянно пишет,что ошибка.

Сначала я создала класс MyException c конструктором без параметров.

public class MyException : Exception
{
    public MyException()
    {

MessageBox.Show("В файле не указано количество вершин. Файл не может быть обработан");
    }

Потом я сделала так:

if (STREAM_READER.ReadLine() == "")
                {
                    throw new MyException();

}

else

VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadLine());

Но когда я запускаю, то пишет исключение в строке VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadL ine());, которое не обработано.

Пробовала сделать еще другим способом:

try
{
VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadLine());
throw new MyException();
}
catch(MyException ex)
{
MessageBox.Show(ex.Message);
}

Все равно пишет, что ошибка в той же строке. Подскажите, пожалуйста, как правильно создать пользовательское исключение для строки VERTEX_COUNT = Convert.ToInt32 (STREAM_READER.ReadL ine ()?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
хотів теж написати про стиль коду...
в даному випадку CamelCasing — streamReader, vertexCount
ІМХО, з культури коду починається програмування, бо коли просиш когось помогти, а в тебе
в коді змінні укр/рос словами латиницею і методи _do_soMething () то можуть і послати

ну і відвикнути потім тяжко буде


VERTEX_COUNT = Convert.ToInt32 (STREAM_READER.ReadLine ());

Змінні великими буквами щоб добре видно було?) («На замітку топікстартеру»)

Я это примерно и имел ввиду. Т.е. исключение — ситуация, когда программа не знает как вести себя дальше. Хотя к примеру в Common Lisp вместо исключений используются сигналы и есть возможность при сигнализировании о ошибке рядом указать возможные шаги восстановления работоспособности процесса — перезапуски, и обрабатывающий ошибку код выше по стеку при желании может обработав ошибку вернуться в место ее возникновения по месту нужного перезапуска.

А как насчет просто в лоб использовать название для понимания что когда использовать?
К примеру:
если пустая строка может случиться и это нормально/ожидаемо обрабатывать файлы с пустыми строками, поэтому это скорее условие в обработке логики, а не неожиданая ситуация, так как мы же ее ожидаем и даже логику на обработку имеем,
а если у нас случилось, что-то неожиданое, в результате чего мы не знаем что делать дальше и нам нужно как-то максимально просто известить весь код об этой ошибке и прекратить обработку в текущем бизнес скопе /*понятно, что на более высоком уровне можно перехватить и к примеру вызвать другой обработчки, поэтому имееться бизнес скоп*/
к примеру ошибка сокета в SQL Connection — с точки зрения connection обьекта он не знает что делать дальше для продолжения корректной работы — это исключительная ситуация

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

Спасибо, Капитан Очевидность: -)

Опять же:
1. Некоторые товарищи рекомендуют создавать свои исключения только в библиотеках классов и компонентах, во всех остальных случаях использовать стандартные, подходящие по смыслу, или просто Exception.

2. В некоторых случаях вместо исключений лучше использовать возвращаемое значение типа bool (успех/неуспех), если ошибка вероятна или ожидаема, или не имеет значения какая именно произошла ошибка. Так например сделаны методы Parse / TryParse — первый выбрасывает исключение, а второй просто говорит «получилось/не получилось». Второй работает быстрее, а первый может дать больше информации почему не получлось, ну и удобней.

Не соглашусь по обоим пунктам.
1. Чем специализированнее исключение, тем лучше. А то получится «зачем просать дивайдид бай зеро, когда можно инвалидаргумент»?
2. Множество программистов думают, что исключения — это что-то страшное и они должны появляться когда возникает почти физический сбой.© откуда-то

Если программа получает фигуру с нулем вертексов, мне кажется это не управление логикой, а именно ошибка.

Плохая идея создавать свои исключения, когда есть системные.
В случае, когда файл вернул 0, можно выкинуть InvalidOperationException или ArgumentException, в зависимости от кода. А вообще, использовать исключения для управления логикой не рекомендуется. Т.е. лечше использовать
if (< строка пустая>)

MessageBox.Show («< сообщение> »);

krolex, не був би таким впевненим) якщо б людина взагалі не розуміла нічого, то не зробила б таки програму хоча б за допомогою підказок:) особливо якщо тільки новичок))

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

Программу переделала и у меня заработало. Всем спасибо за советы.=)

Хай мене пробачить автор, але там помилка в ДНК: (. Може все ж таки в менеджери по продажу? А не в програмісти.



void Process()
{
// ...
if (STREAM_READER.ReadLine() == "")
{
throw new MyException();
}
else
try
{
VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadLine());
}
catch
{
throw new MyException();
}
}
//...
// Process() usage
try
{
Process();
}
catch(MyException ex)
{
MessageBox.Show(ex.Message);
}

try
{
VERTEX_COUNT = Convert.ToInt32 (STREAM_READER.ReadLine ());
}
catch
{
throw new MyException (“В файле не указано количество вершин. Файл не может быть обработан”);
}
Класс MyException:
public class MyException: ApplicationException
{
public MyException ()
{
// MessageBox.Show ( “hhjk” );
}
public MyException (string message): base (message)
{
} }

У меня пишет, что необработанное исключение throw new MyException (“В файле не указано количество вершин. Файл не может быть обработан”);

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

Во-вторых, вы дважды вызываете ReadLine (), получая первую и вторую строку файла. Вторая передается методу Convert.ToInt32 (). Если это не строковое представление числа или строка в файле только одна, это и вызовет исключение.


try
{
VERTEX_COUNT = Convert.ToInt32(STREAM_READER.ReadLine());
}
catch
{
throw new MyException();
}

Здаецца мне что STREAM_READER.ReadLine () возвращает не совсем число...

Підписатись на коментарі