C ++ / C # исключение - PullRequest
       1

C ++ / C # исключение

1 голос
/ 20 января 2011

В c ++ я могу генерировать пустую строку как исключение, но в c # я должен выбросить Exception.Что такое эквивалент C # броска строки в c ++?

Например, в c ++ я могу throw "something bad happened".В c # это будет .....?

Ответы [ 2 ]

6 голосов
/ 20 января 2011

Вопрос довольно неясен, но я думаю, что проблема в том, что "в 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.

1 голос
/ 20 января 2011

C # позволяет выбрасывать только объекты, полученные из класса Exception.Сам CLR также позволяет генерировать другие типы, поэтому, если вы действительно этого хотите, у вас должна быть возможность написать метод, который генерирует строку на каком-либо другом языке или напрямую на IL.Вы не сможете перехватить его как строковое исключение в C # (только как неизвестное исключение с «catch» без типа исключения).

В зависимости от ваших целей может быть достаточно 1003 *.РЕДАКТИРОВАТЬ (спасибо Нейл): но вы должны создать свое собственное исключение, если это не одноразовый эксперимент.

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