У меня есть веб-приложение ASP MVC, и я пытаюсь настроить ведение журнала ошибок, в котором я пытаюсь отобразить дружественное пользовательскому интерфейсу сообщение для веб-сайта и записать более подробное сообщение в нужную базу данных.Моему приложению может не потребоваться всегда регистрировать сообщение об ошибке в БД, но я хотел настроить Custom Exception таким образом, чтобы он обрабатывал оба сценария.
- Показать короткое дружественное пользовательскому интерфейсу сообщение и подробное сообщение об ошибке журнала в БД
- Показать короткое дружественное к интерфейсу сообщение без входа в БД.
Вот что у меня есть: CustomException: если detailMessage пройден, получить новый guid, зарегистрировать сообщение в БД и объединить значение guidin shortMessage.
public class CustomException : Exception
{
public CustomException(string message) : base(message)
{
}
public CustomException(string shortMessage, string detailMessage = "") : base(shortMessage)
{
if (!string.IsNullOrWhiteSpace(detailMessage))
{
string loggingId = Guid.NewGuid().ToString();
//code to log in DB with detail message
shortMessage = $"Reference# : {loggingId}. {shortMessage}";
}
}
}
ThrowIf Helper Метод для проверки значения, чтобы код был чище, и мне не нужно этого делать, если проверка блока выполняется как старая школа в веб-слое.
public static class ThrowIf
{
public static void IsZeroOrNegative(int argument, string shortMessage, string detailMessage = "")
{
if (argument <= 0)
{
throw new CustomException(shortMessage, detailMessage);
}
}
public static void IsNull(object argument, string shortMessage, string detailMessage = "")
{
if (argument == null)
{
throw CustomException.LogMessage(shortMessage, detailMessage);
}
}
}
Код веб-слоя: (Пожалуйста, не спрашивайте, почему я не выкидываю ArgumentException и не использую свое собственное CustomException в этом сценарии)
public ActionResult GetEmployee(int employeeId)
{
var responseViewModel = new EmployeeModel();
try
{
ThrowIf.IsZeroOrNegative(employeeId, shortMessage: "This is short message for UI.", detailMessage: "This is detail message for DB");
}
catch(CustomException ex)
{
ViewBag.Error = ex.Message();
}
return View(responseViewModel);
}
Проблема: как вы можете видеть в моем коде CustomException, если я передамзначение для 'detailMessage', оно обновляет shortMessage с текстом 'Reference ..'.Теперь в веб-коде всякий раз, когда возникает ошибка, текст для ex.Message () не содержит текст «Ссылка ...» и показывает только «Это короткое сообщение для пользовательского интерфейса» вместо «Ссылка №: [значение guid],Это короткое сообщение для пользовательского интерфейса.
Кто-нибудь знает, почему ex.Message не отображает обновленный текст, когда ошибка обнаруживается в веб-слое?