Что означает в .NET: блок try-catch без какого-либо Исключения как параметр для выгоды?
Это означает, что блок catch перехватит любое исключение.
Это также означает, что вы ничего не можете сделать с объектом исключения, поскольку у вас нет на него ссылки.
Вы можете использовать этот шаблон, если действительно не заботитесь о возникновении каких-либо исключений (и не хотите с ними ничего делать), но обычно вам следует избегать этого стиля.
Перехватывает все перехватываемые исключения. Обычно это плохая идея.
Прежде всего, небольшое предисловие. 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 # », третье издание которой уже в продаже.
Есть два типа исключений: совместимые с CLS, производные от класса Exception и несовместимые с CLS (когда может быть выдан любой объект - Int32, DateTime и т. Д.) ). Предложение catch
без исключения использовалось до .net framework 2.0, чтобы поймать несовместимое с CLS исключение, но теперь они улавливаются и обертываются в RuntimeWrappedException
со свойством WrappedException
, указывающим на брошенный объект. Вот почему следует избегать такого кода в более новых версиях фреймворка.
Некоторые языки определяют свой входной файл в терминах входных строк, где каждая входная строка представляет собой последовательность символов, заканчивающихся возвратом каретки. Если их грамматика определена таким образом, то последняя допустимая строка файла также должна быть прервана возвратом каретки.
-121--626905-Будут обнаружены все исключения, но у вас не будет доступа к объекту исключения в блоке catch.
Это может быть полезно для выполнения некоторых действий в отношении любой ошибки перед повторным выбросом.
-121--4126584-Хотя предложение catch можно использовать без аргументов, чтобы перехватить любой тип исключения , это использование не рекомендуется. В общем, следует ловить только те исключения, от которых вы умеете восстанавливаться. Поэтому всегда следует указывать аргумент объекта, производный от System..:: .Exception
Это почти то же самое, что и catch (Exception ex)
, если вы не используете неуправляемые вызовы, потому что все исключения в .NET происходят от класса Exception
. Он используется, когда вам не нужен экземпляр Exception
в блоке catch
. Но catch
без Exception
в качестве параметра будет ловить и неуправляемые исключения, потому что в других неуправляемых языках исключения не могут быть производными от класса Exception
.
Хотя предложение catch можно использовать без аргументов для catch любого типа исключения , это использование не рекомендуется. В общем, следует ловить только те исключения, от которых вы умеете восстанавливаться. Поэтому всегда следует указывать аргумент объекта, производный от System..:: .Exception
-121--4126588-Я надеюсь, что это поможет вам понять и легко преобразовать ваше монолитное однопоточное приложение в многопоточное. Извините, что это для другого языка программирования, но чем меньше объясняемые принципы одинаковы.
http://www.freevbcode.com/ShowCode.Asp?ID=1287
Надеюсь, это поможет.
-121--2072753-Перехватывает каждое исключение, и у вас нет доступа к самому экземпляру исключения. Который, по мне, обычно кажется кодовым запахом (есть некоторые исключительные случаи, когда это можно считать нормальным)
Я всегда считаю его похожим на оператор On Error Resume Next
в VB.
Он перехватит все исключения, но у вас не будет доступа к объекту исключения в блоке перехвата.
Это может быть полезно для выполнения некоторых действий с любой ошибкой перед повторной выдачей.