Что означает в .NET: блок try-catch без какого-либо Исключения как параметр для выгоды?

Что означает в .NET: блок try-catch без какого-либо Исключения как параметр для выгоды?

6
задан odiseh 18 February 2010 в 11:08
поделиться

8 ответов

Это означает, что блок catch перехватит любое исключение.

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

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

4
ответ дан 8 December 2019 в 05:21
поделиться

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

2
ответ дан 8 December 2019 в 05:21
поделиться

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

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

Надеюсь, это проливает свет.

Для получения дополнительной информации я могу обратиться к великой книге Джефри Рихтера « CLR via C # », третье издание которой уже в продаже.

1
ответ дан 8 December 2019 в 05:21
поделиться

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

1
ответ дан 8 December 2019 в 05:21
поделиться

Некоторые языки определяют свой входной файл в терминах входных строк, где каждая входная строка представляет собой последовательность символов, заканчивающихся возвратом каретки. Если их грамматика определена таким образом, то последняя допустимая строка файла также должна быть прервана возвратом каретки.

-121--626905-

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

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

-121--4126584-

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

0
ответ дан 8 December 2019 в 05:21
поделиться

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

10
ответ дан 8 December 2019 в 05:21
поделиться

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

-121--4126588-

Я надеюсь, что это поможет вам понять и легко преобразовать ваше монолитное однопоточное приложение в многопоточное. Извините, что это для другого языка программирования, но чем меньше объясняемые принципы одинаковы.

http://www.freevbcode.com/ShowCode.Asp?ID=1287

Надеюсь, это поможет.

-121--2072753-

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

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

0
ответ дан 8 December 2019 в 05:21
поделиться

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

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

1
ответ дан 8 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: