Позвольте мне пролить свет на то, как я обычно обрабатываю исключения в проектах, над которыми работаю. Но давайте разберемся на разделы.
Страницы ошибок
Страницы ошибок не должны показывать настоящее исключение в рабочей среде. Пользователю не нужно знать, что в базе данных произошел сбой, который может подвергнуть вашу систему проблемам безопасности. Страница с общей ошибкой или хорошо документированным кодом ошибки подойдет. Но, конечно, в вашей среде разработки можно показывать исключения. Я бы посоветовал использовать customErrors mode="RemoteOnly"
в этом случае.
Код ошибки
В зависимости от системы, которую вы разрабатываете, было бы важно иметь в сообщении код ошибки. Например, пользователь мог увидеть «Невозможно подключиться (XYZ_1234)» или «Не удалось подключиться (ABC_9876)» - то же сообщение, разные коды - и отправить его на группа поддержки. Если у службы поддержки есть документ, соответствующий кодам с реальными исключениями, они смогут отправить разработчикам соответствующий отчет.
Блоки Try / Catch
Try / Catch - ваш лучший друг, когда дело касается исключения. Тем более, что это поможет вам при необходимости настроить исключение. У вас может быть ряд настраиваемых классов исключений - каждый со своей характеристикой, - которые помогут вам узнать о проблеме еще до отладки. Один простой пример:
public class ExceptionWithCode : Exception
{
public ExceptionWithCode(string code, string message) : base(message)
{
this.Code = code;
}
public string Code { get; }
}
В коде вы должны подходить к этому примерно так:
try
{
// Do whatever database operation here
}
catch (SqlException ex)
{
// Log the exception
_logService.Log(ex);
// Throw something else to the user
throw new ExceptionWithCode("XYZ_1234", "Unable to connect");
}
catch (Exception ex)
{
// Log the exception
_logService.Log(ex);
// Throw something else to the user
throw new ExceptionWithCode("ABC_9876", "Unable to connect");
}
Обратите внимание, что я использую 2 защелки. Во-первых, я знаю, что это исключение может произойти, поскольку я подключаюсь к БД, а во-вторых, на случай, если может произойти что-то еще. Кроме того, пользователь не знает настоящего исключения, поскольку он / она получает просто случайное исключение с кодом вместо сбоя соединения с базой данных.
Журналы
Это очень важная часть. Помните: Вы никогда не должны показывать пользователю реальные исключения. Вместо этого регистрируйте их в удобном для вас месте. Это может быть файл на сервере, в базе данных или даже в журналах событий Windows. Вам не обязательно писать собственный инструмент для ведения журнала, вы можете использовать все, что доступно в Интернете. Мне больше всего нравится SeriLog, поскольку я регистрирую большинство своих событий / исключений в текстовых файлах. Но я довольно долго использовал ELMAH с .NET Framework, и это было неплохо для журналов в формате XML. .
Это работает для меня, потому что:
- Пользователь проинформирован о проблеме и может связаться со службой поддержки.
- Я не предупреждаю злоумышленников о недостатках моей системы (по крайней мере, не ясно)
- Я знаю, какое исключение видел пользователь, благодаря предоставленному им коду ошибки
- Есть журналы, которые нужно анализировать, когда мне нужно
person
Davidson Sousa
schedule
20.06.2019
redirectMode="ResponseRewrite"
- лишь одно из требований - person Panagiotis Kanavos   schedule 20.06.2019app.UseExceptionHandler("/Home/Error");
, как показано в этом вопросе - person Panagiotis Kanavos   schedule 20.06.2019don't follow blindly "best practices" without understanding what they mean, what they are for and what they are *not* for
. Не используйте слепо код, который выглядит актуальным - это следствие. Исключения следует ловить там, где с ними можно работать. Если вы правильно напишете свои методы, ограничивая побочные эффекты, вам, возможно, придется обрабатывать исключения только на верхнем уровне. Однако то, что вы там делаете, зависит от типа исключения, типа приложения, метода, пользователей, требований к поддержке. - person Panagiotis Kanavos   schedule 20.06.2019Product ID XYZ not found in the database
илиDatabase didn't respond
. Разработчикам, с другой стороны, требуются совсем другие журналы с полной информацией. - person Panagiotis Kanavos   schedule 20.06.2019