Что это означает в .Net: блок try-catch без каких-либо исключений как параметр для catch? - PullRequest
6 голосов
/ 18 февраля 2010

Что это значит в .Net: блок try-catch без каких-либо исключений в качестве параметра для catch?

Ответы [ 9 ]

10 голосов
/ 18 февраля 2010

Это почти то же самое, что и catch (Exception ex), если вы не используете неуправляемые вызовы, потому что все исключения в .NET происходят из класса Exception. Он используется, когда вам не нужен экземпляр Exception в вашем блоке catch. Но catch без Exception в качестве параметра будет перехватывать также неуправляемые исключения, поскольку в других неуправляемых языках исключения не могут быть получены из класса Exception.

4 голосов
/ 24 января 2012

Это означает, что вы пытаетесь перехватить исключения, не соответствующие CLS.

Насколько я понимаю, в версии 2.0 CLR, когда не соответствует CLS исключение, CLR автоматически создает экземпляр RuntimeWrapped- Исключение класса и инициализирует его личное поле для ссылки на объект, который был фактически брошен. По сути, CLR теперь превращает все не-CLS-совместимые исключения в CLS-совместимые исключения.

4 голосов
/ 18 февраля 2010

Это означает, что блок catch поймает любое исключение.

Это также означает, что вы ничего не можете сделать с объектом исключения, так как у вас нет ссылки на него.

Вы можете использовать этот шаблон, если вы действительно не заботитесь о каких-либо исключениях (и не хотите ничего с ним делать), но обычно вам следует избегать этого стиля.

2 голосов
/ 18 февраля 2010

Ловит все ловимые исключения. Обычно это плохая идея.

1 голос
/ 18 февраля 2010

Прежде всего, небольшое предисловие.CLR позволяет выбрасывать экземпляр любого типа в качестве исключения;например, можно бросить System.String или даже System.Windows.Forms.Form объект.Тем не менее, компилятор C # позволяет генерировать только объекты, производные от Exception.Таким образом, единственный способ отловить исключение, не совместимое с CLS, состояло в том, чтобы в вашем коде был пустой блок catch().

До версии 2.0 в CLR были непустые блоки захвата (т. Е. catch (Exception ...))отлавливать только CLS-совместимые исключения.Но в версии 2.0 CLR Microsoft ввела новый класс RuntimeWrappedException, чтобы при возникновении исключения, не совместимого с CLS (например, из другого языка), CLR автоматически создавал экземпляр класса RuntimeWrappedException.С тех пор больше нет необходимости иметь пустые блоки перехвата (т.е. catch()), потому что catch (Exception ) перехватит все исключение в любом случае.

Надеюсь, что это проливает некоторый свет.1015 * Для получения дополнительной информации я могу обратиться к замечательной книге Джефри Рихтера " CLR via C # ", третье издание которой уже в продаже.

1 голос
/ 18 февраля 2010

Существует два типа исключений: CLS-совместимые, производные от класса Exception и не CLS-совместимые (когда может быть выброшен любой объект - Int32, DateTime и т. Д.). Предложение catch без исключения использовалось ранее .net Framework 2.0 для перехвата исключения, не совместимого с CLS, но теперь они перехватываются и заключаются в RuntimeWrappedException со свойством WrappedException, указывающим на брошенный объект. Вот почему такого кода следует избегать в новых версиях фреймворка.

1 голос
/ 18 февраля 2010

Он будет перехватывать все исключения, но у вас не будет доступа к объекту исключения в блоке catch.

Это может быть полезно для выполнения некоторых действий с любой ошибкой перед повторным сбросом.

0 голосов
/ 18 февраля 2010

Он перехватывает каждое исключение, и у вас нет доступа к самому экземпляру исключения. Что, на мой взгляд, обычно напоминает запах кода (есть несколько исключительных случаев, когда это можно считать нормальным)

Я всегда считаю его похожим на оператор On Error Resume Next в VB.

0 голосов
/ 18 февраля 2010

Хотя предложение catch можно использовать без аргументов для перехвата любого типа исключения , такое использование не рекомендуется. В общем, вы должны ловить только те исключения, которые вы знаете, как восстановить. Поэтому вы всегда должны указывать аргумент объекта, полученный из System .. ::. Exception

...