Вопрос довольно неясен, но я думаю, что проблема в том, что "в C ++ вы можете бросать строки; как насчет C #?"
В C # вы генерируете исключения аналогично тому, что вы делаете в C ++; основное отличие состоит в том, что в C # вы можете генерировать только классы, производные от System.Exception
, в то время как в C ++ вы можете генерировать любые типы (хотя часто рекомендуется генерировать только классы, производные от std::exception
или другого базового класса исключений; бросить простые строки в C ++).
Имейте в виду, что в C # есть не только System.Exception
, но и множество различных производных классов, описывающих наиболее распространенные причины для исключения (ArgumentOutOfRangeException
, InvalidOperationException
, OverflowException
,. .. просто чтобы сказать несколько случайных), и это дает вам гораздо лучший способ выразить тип проблемы (выражается с типом, который может быть выделен в catch
блоках), и вы все еще можете указать Вашу пользовательскую строку ошибки, передав ее в конструктор. Это гораздо лучше, чем просто бросить строку, также потому, что, если исключение «всплывает» до самого верхнего catch
, что более или менее может просто зарегистрировать проблему и выйти, все же ее можно поймать, поймав общий System.Exception
и по-прежнему отображать / регистрировать строку ошибки.
Обратите внимание, что это возможно и в C ++, но готовые производные исключения (в <stdexcept>
) намного меньше, чем в .NET Framework.
Другое важное отличие (исходящее от C ++) состоит в том, что, хотя в C ++ разматывание стека, полученное с помощью throw, немедленно уничтожает любой локальный объект (концепция, на которой построен RAII), в C # уничтожение является недетерминированным (это может произойти при в любой момент после того, как переменные, указывающие на них, выйдут из области видимости); поэтому важно иметь классы, которые в таких случаях должны быть освобождены, немедленно реализовать интерфейс IDisposable
и использовать блоки using
.