Во-первых, большинство людей решают эту ошибку, не перехватывая исключение. Таким образом, исключение распространяется на ASP.NET, который отображает веб-страницу "500 Internal Error", и вся соответствующая информация регистрируется.
Если ваш сервер настроен для работы, на странице ошибки будет просто указано «произошла ошибка, подробности были зарегистрированы».
Если сервер настроен для разработки, вы получите знаменитую желтую страницу с типом исключения, сообщением и трассировкой стека.
Проглатывание исключения и ручное перенаправление на страницу с ошибкой — плохая практика, поскольку она скрывает ошибки. Есть инструменты, которые проверяют ваши журналы и дают вам хорошую статистику, например, о процентах успешных/неудачных запросов, и они больше не будут работать.
Таким образом, не проглатывание исключения — это то, что люди делают, и, по крайней мере, это решает вашу проблему.
Теперь я нахожу это очень неуклюжим, потому что мне не нравится вручную искать исходные файлы, упомянутые на желтой странице, и вручную переходить к указанным номерам строк. Жёлтая страница мне практически ни к чему, с тем же успехом она могла бы просто сказать «произошла ошибка, плачь мне рекой, нах-нах-нах». Я не читаю желтую страницу.
Вместо этого мне нравится регистрировать исключения самостоятельно, и мой регистратор начинает каждую строку с full-path-to-source-filename(line):
, так что каждая строка в журнале отладки в Visual Studio кликабельна, и нажатие на строку автоматически открывает правильный исходный файл, и прокручивается до той строки, которая выдала сообщение журнала. Если вам нужна эта роскошь, то идите вперед и перехватите исключение, но сразу после регистрации исключения вы должны повторно создать его, чтобы все шло своим чередом.
Поправка
Вот некоторая информация, которая была добавлена в комментарии:
Итак, вы можете сделать следующее:
try
{
...
}
catch (Exception e)
{
log( "information" );
throw; //special syntax which preserves original stack trace
}
Or
try
{
...
}
catch (Exception e)
{
throw new Exception( "information", e ); //also preserves original stack trace
}
Не делайте не этого: catch( Exception e ) { log( "information" ); throw e; }
, потому что при этом теряется исходная информация о трассировке стека e
.
person
Mike Nakis
schedule
11.12.2015