Отказ от ответственности, я из фона Java. Я не делаю много С#. Там существует большая передача между двумя мирами, но, конечно, есть различия, и каждый из них имеет отношение к Исключениям.
Недавно я ответил на вопрос С#, предполагающий, что в некоторых случаях разумно это сделать:
try {
some work
} catch (Exeption e) {
commonExceptionHandler();
}
(Причины несущественны). Я получил ответ, который я не совсем понимаю:
до .NET 4.0, очень сложно поймать Исключение. Это означает, что вы поймаете различные низкоуровневые фатальные ошибки и поэтому маскировка ошибок. Это также означает, что в случае какой-то коррупции, которая вызывает такое исключение, любое открытое наконец, блоки в стеке будут выполняется, поэтому даже если Функция callExceptionReporter пытается для входа в систему и выхода, он может даже не получить к этой точке (наконец, блоки могут бросить снова или вызвать больше коррупции, или удалить что-то важное из диска или базы данных).
Позвольте мне больше смутить, чем я понимаю, но я не согласен с этим. Пожалуйста, комментарии других людей.
-
Я понимаю, что существует множество исключений низкого уровня, которые мы не хотим глотать. Моя функция commonExceptionHandler() могла бы разумно изменить их. Это похоже на этот ответ на соответствующий вопрос. Что говорит: "В зависимости от вашего контекста может быть приемлемым использование catch (...), при условии, что исключение будет повторно выбрано". Поэтому я заключаю, что использование catch (Exception) не всегда является злым, молчаливо проглатывая некоторые исключения.
-
Фраза "До .NET 4 очень плохо выходить из-за исключения" Какие изменения в .NET 4? Это ссылка на AggregateException, которая может дать нам некоторые новые вещи, связанные с исключениями, которые мы улавливаем, но я не думаю, что меняет основное правило "не усвоить".
-
Следующая фраза действительно беспокоит. Это может быть правильно?
Это также означает, что в случае какой-то коррупции, которая вызывает такое исключение, любое открытое наконец, блоки в стеке будут (наконец, блоки могут бросить снова или вызвать больше коррупции, или удалить что-то важное из диск или база данных)
Я понимаю, что если какой-то код низкого уровня имел
lowLevelMethod() {
try {
lowestLevelMethod();
} finally {
some really important stuff
}
}
и в моем коде я вызываю lowLevel();
try {
lowLevel()
} catch (Exception e) {
exception handling and maybe rethrowing
}
Независимо от того, поймал ли я исключение Exception, это не влияет на выделение блока finally. К тому времени, когда мы покинем lowLevelMethod(), наконец-то уже запущен. Если в конечном итоге произойдет какая-либо из плохих вещей, например, поврежденный диск, тогда он это сделает. Мой выбор Исключения не имел никакого значения. Если он достигает моего блока Exception, мне нужно сделать правильные вещи, но я не могу быть причиной dmis-executing finallys